Git的高级用法
2016-11-02
git命令
从远端获取
git remote -v // 查看远程仓库
// 获取但不合并
git fetch <远程版本库>
// 如:
git fetch origin // origin是远程仓库的默认名
git fetch https://github.com/heheda/232.git
// 获取并合并到当前分支
git pull // 等价于 git pull origin
git pull https://github.com/heheda/232.git master // 当不是从默认远程库获取时,需要指定获取哪个分支,这里就是指定获取master分支
git pull <remoteName> <localBranchName> // 拉取远程仓库到本地分支
git pull origin test // 拉取远程库到本地test分支
从远程同步代码,一般用这种方式:
git fetch origin master:temp // 从远程库origin的master分支获取版本库到本地temp分支
git diff temp // 比较本地tmp分支和当前所在分支(一般为本地master分支)
git merge temp // 合并本地temp分支到当前分支(一般为本地master分支)
不常用的git命令
下面介绍的是工作中不常用的git命令
标签
git tag 1.0 // 为当前分支最后一次提交创建标签,标签名无法修改
git tag dev_v1.1.1 master // 为master分支最近一次提交创建标签
git tag dev_v1.1.0 4e6584278 // 为某次历史提交创建标签
git tag // 显示标签列表
git checkout dev_v1.1.1 // 检出标签
git branch dev2 dev_v1.1.1 // 由dev_v1.1.1创建分支dev2
git checkout -b dev3 dev_v1.1.0 // 由dev_v1.1.0创建分支dev3
git tag -d 1.0 // 删除标签
查看状态
git branch -v // 查看每个分支最后的提交
导出版本库
git archive --format=zip HEAD>nb.zip
git archive --format=zip --prefix=nb1.0/ HEAD>nb.zip
工作中会遇到的场景
总结一下工作中经常遇到的场景
修改最近一次提交的信息
- 场景:你用 git commit 命令做了一次提交操作,提交完才想起提交信息没有按规范写,在 git push 之前,你想把提交信息改一改
- 命令:git commit -amend
git commit --amend -m "new commit message" // 提交了,发现提交信息写错了,修改上次提交的信息可以用这条命令
git commit -C HEAD -a --amend //不会产生新的提交历史记录,复用HEAD留言,增补提交,而不增加提交记录
撤销提交之后重做
- 场景:你提交了一些内容,然后又用 git reset HEAD^ –hard 撤销了这些更改,然后纠结的你又发现:我还是得还原这些修改!
- 命令:git reflog 和 git reset
- 解释:我们对 git log 命令比较熟悉,它能显示提交列表,而 git reflog 则显示的 HEAD 变更列表。ref log 嘛,字面上也能理解。知道了 HEAD 变更的信息列表,那我们就可以用 git reset 来做我们想重做了。但是需要注意的是:git reflog 不会永远存储,Git 将定期清理那些不可达(unreachable)的对象,所以不要期望能在 reflog 里找到数据前的 HEAD 变更记录。
// 我提交了一些内容
$ git commit -m "commit 17"
// 接着我撤销了这些更改
$ git reset HEAD^ --hard
// 额,我这时发现我得还原这些更改
// Step 1: 用 git reflog 查看
$ git reflog
2750087 HEAD@{0}: reset: moving to HEAD^
ad14ba3 HEAD@{1}: commit: commit 17
...
// 发现了刚才的那次撤销以及前面那次提交的信息
// Step 2: 用 git reset 回到那次提交
$ git reset ad14ba3
HEAD is now at ad14ba3 commit 17
// 打印出来的信息显示,我们做到了,更改被还原过来了
// 再看看 reflog 信息和 log 信息
$ git reflog
ad14ba3 HEAD@{0}: reset: moving to ad14ba3
2750087 HEAD@{1}: reset: moving to HEAD^
ad14ba3 HEAD@{2}: commit: commit 17
...
$ git log
commit ad14ba39c57b4b43b913ebc273500afa815bb0e3
Author: sc <sc@sc-MacBookPro.local>
Date: Tue Jul 14 22:55:24 2015 +0800
commit 17
储藏当前工作
- 场景:经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是 git stash 命令。
- 命令:git stash
- 解释:储藏可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。你可以使用 git stash list 来看储藏列表,可以用 git stash apply 来把之前储藏的工作拿出来继续。
停止跟踪一个已经被跟踪的文件
- 场景:你意外将 application.log 添加到仓库中,现在你每次运行程序,Git 都提示 application.log 中有 unstaged 的提交。你在 .gitignore 中写上 *.log,但仍旧没用。怎么告诉 Git 停止跟踪这个文件的变化呢?
- 命令:git rm –cached application.log
- 解释:尽管 .gitignore 可以阻止 Git 跟踪所指定的文件的变化甚至让 Git 不去提醒这些文件的存在,但是,一旦在你把某个文件加入 .gitignore 之前已经把它 git add 和 commit 了,Git 依然会持续跟踪这个文件的变化。如果你希望移除那些应当被忽略的文件,可以先用 git rm –-cached 命令停止对改文件的跟踪,这个命令不会物理删除文件,然后你还需要在 .gitignore 中添加它以保证以后都不再跟踪这个文件的变化。完成这些后,你将不会在 git status 中看到它,也不会再把这个文件 commit 了。