git 使用笔记 (1)

记录一下实际使用过程中用到的命令和结果,不分解过程,也比较零散。详细的分析可以参考这本书:《Pro Git》

本地操作

要对某个目录进行版本控制,可以在该目录下执行命令(假设工作目录是 git-test,里面只有一个文件 a.txt):

git init

之后会看到提示:

Initialized empty Git repository in /path/to/git-test/.git/

在 git-test 目录下生成一个目录 .git,里面就是 git-test 的版本信息。git 只会在根目录下建立一个 .git 目录包含所有的信息,而不像 svn 一下在各个子目录下都建一个 .svn 目录。

建立了目录信息,但是 git 不会主动把目录下的所有文件或子目录都纳入版本控制中,必须手动添加要 git 进行版本控制的内容。如果要将 a.txt 加入版本控制,执行下面的命令:

git add a.txt

这样 git 就会把 a.txt 加入版本控制列表。如果要把当前目录下的所有文件/子目录都加入版本控制,可以执行下面的命令:

git add .

修改完成后,执行下面的命令进行提交:

git commit

这条命令的提交只会提交到本地仓库(也就是当前目录的 .git)中,而不会影响中心仓库(如果是从别的仓库取出来的代码的话),所以可以放心提交。

修改了 a.txt 之后如果需要提交,需要先执行“git add a.txt”然后再执行“git commit”,变更的内容才会提交到本地仓库中;或者直接执行

git commit -a

这条命令会把已经加入到 git 管理的所有文件的变更都提交到仓库中。提交后可以使用

git log

查看提交历史。要配置提交者的信息,执行下面的命令:

git config –-global user.name "user"
git config –-global user.email "user@email"

带“--global”选项的配置信息会被保存到 ~/.gitconfig 中。

从仓库里取出一个副本进行修改:

git clone /path/to/git-test /path/to/git-copy

在 git-copy 下进行的 commit 操作只会影响 git-copy 下的仓库,而不会对 git-test 进行修改。

多人合作

如果多人合作开发一个项目就需要建立一个中心仓库。像上面那样 git-copy 不能直接把内容提交到 git-test。假设中心仓库的位置是 /path/to/git-repos,进入 git-repos,然后执行命令:

git init --bare --shared

切换到 git-test 目录,执行命令:

git push /path/to/git-repos master

把 git-test 下的内容提交到中心仓库的 master 分支中。然后添加远程仓库:

git remote add origin /path/to/git-repos

表示把本地的 origin 指向远程仓库 /path/to/repos。接着是更新信息:

git fetch origin

把 HEAD 指向 master 分支:

git remote set-head origin master

添加分支的远程分支信息和 merge 信息,这样 git 才能知道在哪个分支上使用 pull 和 push:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

重新从仓库里取出一个副本进行修改:

git clone /path/to/git-repos /path/to/git-new

修改之后执行 commit 等操作。如果需要把修改的内容提交到中心仓库,执行:

git push

如果有其他人向中心仓库提交了更新,把中心仓库中的更新和本地合并,执行命令:

git pull

如果觉得 git 命令过长可以设置别名:

git config --global alias.co checkout

有“--global”选项的设置都会保存在 ~/.gitconfig 中,现在 ~/.gitconfig 下增加了下面的内容:

[alias]
        co = checkout

这样在命令行输入“git co”就相当于“git checkout”。如果想增加其它别名,修改上面的命令或者直接修改 ~/.gitconfig 的效果是一样的。

分支操作

新建一个 git 仓库时默认包含的分支是 master,查看当前目录的所有分支可以使用命令:

git branch

创建一个新的分支 br1:

git branch br1

再执行“git branch”可以看到当前仓库中的所有分支:

  br1
* master

其中 master 是默认的分支,“*”所标识的分支就是当前正在使用的分支。查看中心仓库有哪些分支:

git branch -r

切换到新增的分支使用命令:

git checkout br1

再执行“git branch”可以发现“*”指向的是 br1,说明当前正在使用的分支是 br1。进行修改和 commit 都只是影响分支 br1,除非再次执行“git checkout”切换到其它分支。

要把分支提交到中心仓库使用命令:

git push origin br1

意思为把本地的 br1 分支推送到远程 origin 仓库(也就是中心仓库)的 br1 分支。命令完成后会有“new branch”字样的提示。一般的命令格式是:

git push [远程仓库名] [本地分支名]

如果要把 br1 在中心仓库的名字改为 newbr1,使用命令:

git push origin br1:newbr1

把 br1 的内容合并到 master 分支中,先切换到 master 分支,在执行 merge 命令:

git checkout master
git merge br1

合并完之后可以安全删除本地 br1 分支:

git branch -d br1

如果要删除修改过但没提交的分支使用“-D”选项。

删除中心仓库上的分支 br1:

git push origin :br1

分支重命名使用命令:

git branch -m [old] [new]

tag 操作

列出所有的 tag:

git tag

将当前版本标记为 tag1:

git tag tag1

将某个历史版本标记为 tag2,只要在最后加上版本的校验和(或能和其它版本区分的前几位字符):

git tag tag2 9fceb02

默认的 push 不会把标签更新到中心仓库,要把标签推送到中心仓库,使用命令:

git push origin [tagname]

要把所有的标签推送到中心仓库,使用选项“--tags”:

git push origin --tags

要取出某个标签的版本,使用 checkout 命令:

git checkout [tagname]

此时如果执行“git branch”命令会输出:

* (no branch)
  br1
  master

如果此时进行了修改而没有提交,切换到别的分支后所有的修改会被丢弃,因为这里是临时分支。

删除 tag 和删除分支的方法类似,只是把命令中的“branch”换成“tag”。tag 的操作和分支很相似,猜测 tag 和分支应该是同一个东西。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注