git中merge和rebase的区别

最开始实习的时候是使用svn,之后正式工作就一直在使用git,这样算起来,使用git也有两年的时间了。以前带我的同事,让我在拉代码的时候要我使用git pull --rebase,一直很纳闷为什么要那样做,后来遇到拉代码的时候有许多冲突要解决,然后去查找资料,才了解到其中的一些事情。今天分享一下,顺便自己也梳理一下。

git pull

git pull 是 git fetch + git merge FETCH_HEAD 的缩写。所以,默认情况下,git pull就是先fetch,然后执行merge 操作,如果加–rebase 参数,就是使用git rebase 代替git merge。

merge 和 rebase

merge 是合并的意思,rebase是复位基底的意思。

现在我们有这样的两个分支,test和master,提交如下:

      D---E test
     /
A---B---C---F master

在master执行git merge test,然后会得到如下结果:

      D--------E
     /          \
A---B---C---F----G   test, master

在master执行git rebase test,然后得到如下结果:

A---B---D---E---C'---F'   test, master  

可以看到,merge操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。

 其他内容放这里

通过上面可以看到,想要更好的提交树,使用rebase操作会更好一点。这样可以线性的看到每一次提交,并且没有增加提交节点。

在我们操作过程中。merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。

而rebase 操作的话,会中断rebase,同时会提示去解决冲突。解决冲突后,将修改add后执行git rebase –continue继续操作,或者git rebase –skip忽略冲突。

原文地址:http://isming.me/2014/09/26/git-rebase-merge/,转载请注明出处。

git使用技巧

这几天开始工作了,工作中使用了git进行项目管理,这才发现原来我以前所知道的git使用那只是一点皮毛。

写一些这几天用到的一些git技巧喽,以后有的话继续更新啦。

git status 查看当前的状态,那些文件修改了,那些文件创建还没有add的。

git add . 添加所有的修改

或者

git add 文件名或者文件路径,添加指定的

git stash 将没有commit的部分文件放到暂存栈去,这样从服务器pull文件的时候不会有问题。

git stash pop 是将暂存栈的东西拿回来
git stash clear 将暂存栈中的东西清空,要慎用,这样你放在暂存中的修改都将丢失

git reset 将所有git add 的撤销

将其他的分支中的某个修改合并到当前分支

  1. git cherry-pick sha1(用gitk 在那个分支上面可以看到)
  2. git reset –soft 合并当前分支和cherry过来的分支。两个分支的代码都保留 如果参数用 hard 那么本地的将会被抹掉
  3. git commit –ammend
    这样就完成了

修改两次前的提交

  1. git rebase -i HEAD~2
  2. 修改那个提交的状态,即把pick改为edit
  3. 回去修改文件
  4. git commit –amend
  5. git rebase –continue
    这样也就ok了

git里面很多东西很有用,好吧,以后好好学习。