记录一下实际使用过程中用到的命令和结果,不分解过程,也比较零散。详细的分析可以参考这本书:《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 和分支应该是同一个东西。