GitHub上有趣的资源Git

Git 进阶命令

2017-06-06  本文已影响369人  奥卡姆剃须刀

之前写的 Git基本操作命令

众所周知, Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了了一个完整的生态圈,学习Git,首先当然水学习Git的基本工作流,相比于SVN等传统的版本控制系统来说,Git是专为分布式版本控制而生的强大工具,使用Git时常用的命令:pull,commit,push 等 貌似很简单。不过,有时你会遇到合并冲突的情况,Git这时会将冲突标记出来,需要你手工来解决。有时,你会不小心将代码提交到错误的分支上,并且又推送到了远程 仓库。还有些时候,你需要切换到不同的分支,但Git却不让你这么做,因为还有未保存的修改。如果需要通过另一个分支的提交来为代码打补丁该怎么做呢?本 文就将介绍12个Git高级命令,合理使用这些命令可以大大提升应用Git的效率。

一 rebase拉上游修改

这么做会将整个feature分支移动到master分支的起点,它会合并master分支上所有新的提交。不过,相比于使用合并提交来说,变基会 通过在原来的分支中为每次提交创建全新提交来重写项目历史。变基的主要好处在于你会得到一个更加整洁的项目历史。此外,这里还有关于变基的陷阱的一些讨 论

二 在执行git rebase后并解决合并冲突

image.png

三 临时性保存修改

$ git stash  Saved working directory and index state WIP on feature: 3fc175f fix race condition  HEAD is now at 3fc175f fix race condition 

好了,现在工作目录就是干净的了

git status : On branch feature nothing to commit, working directory clean

这时就可以安全地切换分支做别的事情了。不过不必担心,暂存的提交依旧还在

git stash list stash@{0}:  WIP on feature: 3fc175f fix race condition

稍后,在回到feature分支后,你就可以取回所有暂存的变更了:

$ git stash pop  On branch feature  Changes not staged for commit:    (use "git add ..." to update what will be committed)         modified:   index.html  Dropped refs/stash@{0} (ac2321cc3a33ba712b8e50c99a99d3c20da9d6b8)  

关于暂存 还有一些其它选项可用 如下所示:

$ git stash save "describe it"   # give the stash a name 
$ git stash clear                # delete a stashed commit  
$ git stash save --keep-index    # stash only unstaged files  

四 克隆一个特定的远程分支

如果想要从远程仓库中克隆一个特定的分支该怎么做呢?通常你会使用git clone,不过这么做会将所有其他分支都一并克隆下来。一个便捷的方式是使用git remote add:

$ git init  
$ git remote add -t  -f origin   
$ git checkout  

五 将cherry-pick远程提交合并到自己的分支中

更有甚者,如果只想将远程仓库的一个特定提交合并到自己的分支中该怎么做呢?可以使用git cherry-pick 来选择给定SHA值的提交,然后将其合并到当前分支中:

$ git cherry-pick 

六 应用来自不相关的本地仓库的补丁

如果需要将另一个不相关的本地仓库的提交补丁应用到当前仓库该怎么做呢?答案就是下面这条命令:

$ git --git-dir=/.git format-patch -k -1 --stdout  | git am -3 -k  

七 忽略追踪文件中的变更

如果你和你的同事操纵的是相同分支,那么很有可能需要频繁执行git merge或是git rebase。不过,这么做可能会重置一些与环境相关的配置文件,这样在每次合并后都需要修改。与之相反,你可以通过如下命令永久性地告诉Git不要管某个本地文件:

$ git update-index --assume-unchanged

八 每隔x秒运行一次git pull

通常,合并冲突出现的原因在于你正在工作的本地仓库不再反映远程仓库的当前状态。这正是我们为什么每天早晨要首先执行一次git pull的缘故。此外,你还可以在后台通过脚本(或是使用GNU Screen)每隔X秒调用一次git pull:

$ screen  $ for((i=1;i<=10000;i+=1)); do sleep X && git pull; done  

九 将子目录分隔为新的仓库

有时,你可能需要将Git仓库中某个特定的目录转换为一个全新的仓库。这可以通过git filter-branch来实现:

$ git filter-branch --prune-empty --subdirectory-filter  master  
# Filter the master branch to your directory and remove empty commits  Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89)  Ref 'refs/heads/master' was rewritten  

现在 仓库会包含指定子目录中的所有文件。虽然之前的所有文件都会被删除,但是他们依旧存在于Git历史中,现在可以将新的本地仓库推送到远程了

十清理

有时 Git提示 untracked working tree filesoverwritten by checkout 造成这种情况的原因有很多。不过通常来说,我们可以使用如下命令来保持工作树的整洁,从而防止这种情况的发生:

$ git clean -f     # remove untracked files  
$ git clean -fd    # remove untracked files/directories  
$ git clean -nfd   # list all files/directories that would be removed

十一 将项目文件打成tar包,并且排除.git目录

有时,你需要将项目副本提供给无法访问GitHub仓库的外部成员。最简单的方式就是使用tar或zip来打包所有的项目文件。不过,如果不小心,隐藏的.git目录就会包含到tar文件中,这会导致文件体积变大;同时,如果里面的文件与接收者自己的Git仓库弄混了,那就更加令人头疼了。轻松的做法则是自动从tar文件中排除掉.git目录:

$ tar cJf .tar.xz / --exclude-vcs  

十二 查找修改者

最后,如果出现混乱的情况,你一定想要找出是谁造成的。如果生产服务器宕机,那么找到罪魁祸首是比较容易的事情:只需执行git blame。该命令会显示出文件中每一行的作者,提交hash则会找出该行的上一次修改,还能看到提交的时间戳:

$ git blame  

最全的Git详解 https://git-scm.com/book/zh/v2

上一篇 下一篇

猜你喜欢

热点阅读