比较了一下git fetch和git pull,总结了一下git stash、git rebase和git merge的常用用法。关于更为详细的细节,比如更多的options,还请参阅git的手册。

get fetch和git pull的区别

简单来说,git pull = git fetch + git merge

做一个小实验:

1. git fetch & git status
git status 仍然会显示 "Your branch is behind 'xxx branch' by N commits"

2. 断网
将电脑网线拔掉或者将无线关闭。

3. git merge & git status
git merge 会显示merge的过程,而git status会显示当前已经是最新的代码。

这个实验说明了:
1. git fetch将远程服务器上的代码拉到了本地,但并不是本地的代码库里,而是本地的某个临时存储的区域,比如可能是.git文件夹里某处(尚需求证);
2. git merge是将以上临时存储区域的代码合并到代码库。当然,这其中可能会存在冲突,那就需要解决冲突。

有一种说法是git fetch比git pull更安全,就是因为在没有冲突的情况下是git pull会自动merge的而开发者可能没有察觉到。但是笔者似乎自用git pull以来,都没有遇见过此种情况,因为如果开发者改变了本地的代码,而无论是commit了还是没有commit,就去运行git pull,似乎都是会有警告的。所以似乎并不存在这种更加安全的说法。如果是这样,那么git pull其实就没什么不好,反而更加方便易用了。

git stash

git stash是一个比较有用的命令。当开发者开发到一半还没有commit的时候,突然意识到应该将代码pull下来,然后在基于pull下来的代码的基础上再继续开发,那么这个时候就可以用git stash了。
git stash将当前的改动保存到一个临时区域(stash),在合适的时机再回放出来。看一个常见case:
1. git stash 或 git stash save
这个命令将当前尚未commit的改动保存到临时区域(stash)。


2. git pull
将最新代码拉到本地。


3. git stash apply
将刚才存储到临时区域的改动再放进代码库里


4. 如果有冲突,则解决冲突;若没有冲突,则可以继续开发了。

常见的git stash的几个命令如下(以下只是简要介绍,更多细节还是要参见手册):
1. git stash list[<options>]
列出当前的stashes. 每个stash都有名字,如:stash@{0}代表当前最新的stash,stash${1}代表前一个stash. 一个输出示例如下:
stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash
其中,"WIP on submit" 和 "On master"是这个stash所在的branch,而后面的内容是这个stash被创建时所基于的commit.

2. git stash show [<stash>]
显示该stash和其所base的代码的不同之处,如git stash show -p stash@{1}显示第二新的stash和基本代码的差异。

3. git stash pop [<stash>]
将stash list里的一个指定的stash移除,并将其应用在当前代码上(apply it on top of the current working tree state, i.e. do the inverse operation of git stash save)。

4. git stash apply [<stash>]
和pop类似,但不会将stash从stash list移除。

5. git stash clear
删除所有的stash

git rebase

git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>] [<upstream> [<branch>]]
如果指定了<branch>,git rebase就会在做任何事情之前先自动执行git checkout <branch>;否则它将保持在当前的branch上。
如果有冲突,那么解决了冲突之后再运行git rebase --continue.

另一个选择是绕过这这个有冲突的commit,即运行git rebase --skip.

而运行git rebase --abort的作用是checkout原来的branch并删除.git/rebase-apply下的相关文件,即放弃做rebase了。

Case 1.

看图如下,并假设当前branch是topic
A---B---C topic
/
D---E---F---G master

那么当运行如下2句命令的任何一句:
git rebase master
git rebase master topic = git checkout topic + git rebase master

结果是:
A'--B'--C' topic
/
D---E---F---G master

这是因为,rebase谁的含义就是以谁为主,来更新当前的branch,在这里就是“以master为主来更新topic”. 那么,所有在topic上开发的commits就会以最新master的commit为基准,在其上重放topic上的commits,所以效果就是在master的G的后面又跟上了A,B,C.

Case 2.
如果upstream branch上已经有了一个当前branch上有的commit,那么该commit将被忽略。见下图:
A---B---C topic
/
D---E---A'---F master

git rebase会生成:
B'---C' topic
/
D---E---A'---F master

Case 3.

git rebase还有一种--onto的用法。见下图。
H---I---J topicB
/
E---F---G  topicA
/
A---B---C---D  master

运行 git rebase --onto master topicA topicB

会生成:
H'--I'--J'  topicB
/
| E---F---G  topicA
|/
A---B---C---D  master


git merge

假设有如下的情形,并且当前的branch是master.
A---B---C topic
D---E---F---G master
那么在运行了git merge topic之后,会形成下图:
A-----B---C topic
/                \
D---E---F---G---H master
git merge topic会重放(replay)自topic branch偏离master以来的所有commits,即A、B、C.
那么git merge和git rebase又有什么不同呢?
如果在master上运行的是git rebase topic的话,就会以topic为主,将EFG放到C的后面作为master的commits,见下图。
E'--F'--G' master

D---A---B---C topic

个人理解是:

在topic branch上想同步master上的代码,用 git rebase master , 因为这样是以master为主,在topic branch上replay(重放) master上的改动;

而在master上想同步topic branch上的代码,则用 git merge master, 这样还是以master为主,在master上replay topic branch上的改动。

比较了一下git fetch和git pull,总结了一下git stash、git rebase和git merge的常用用法。关于更为详细的细节,比如更多的options,还请参阅git的手册。
$ git pull -- rebase 和$ git pull 区别 是 git fetch + git merge FETCH _HEAD的缩写,所以默认情况下, git pull 就是先 fetch ,然后执行 merge 操作,如果加- rebase 参数,就是使用 git rebase 代替 git merge 。更新本地仓库
之前我对 git 的使用并不重视,因为之前都是自己开发代码,没有多人合作过,就是简单的 git pull git push。。。。。 但是在多人团队合作的时候,这种做简单的操作会造成很多问题,可能会造成代码合并弄丢的风险,程序猿的圈里流传着这样的名言,“不会 Git 就是耍流氓”。不懂得同学细细想想。 我先说一下自己日常工作中提交代码的步骤: 1. git add XXX  将修改代码添加到本地...
这篇文章主要是想讲一讲在 git 工作流过程中,如何将你的工作树,变成一条线,而不是线条错乱分开的。 一个优秀的 Git 管理流程应该是职责清晰,条例清晰,网上也有很多的的介绍:https://www.jianshu.com/p/bb980de96be6https://www.oschina.net/translate/a-successful- git -branching-model 一、 rebase stash 的基本用法 stash 它的意思就是,把当前你已经修改了的文件暂存到本地,把你的分支恢复到未
git merge rebase 的区别与选择 转自:https:// git hub.com/geeeeeeeeek/ git -recipes/wiki/5.1-%E4%BB%A3%E7%A0%81%E5%90%88%E5%B9%B6%EF%BC%9A Merge %E3%80%81 Rebase -%E7%9A%84%E9%80%89%E6%8B%A9# merge BY 童仲毅(geeeeeeeeek@ git hub) 这是一篇在原文(BY atlassian)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享
1、 git fetch rebase 的使用,多人操作同一分支时,每次提交代码之前执行 fetch ,然后 rebase ,有冲突时把冲突解决,然后add,commit,push,没有冲突可直接提交。 2、使用第三方jar 采用将jar包写入本地仓库中 pom直接引入的方式来使用 方便打包 lib所在目录需要有pom文件,写入命令为 mvn install:install-file -DgroupId=com.tangyan -DartifactId=JavaCertAPI-SCCA -Dversion=1.0.0-
我们在日常使用 Git 的过程中经常会发生一些意外情况,如果处理不当,则可能会出现代码丢失的假象。本文将针对IDEA&amp; Git 日常开发中的一些场景,为你层层拨开迷雾,解析常见的错误及其发生原因,让你从此不再惧怕代码冲突或丢失问题。 为简化问题,本文假设所有团队成员均在同一分支上开发。 文中更新操作是指在IDEA中单击菜单VCS-Update Project...。 常见工作流程 通常当你早...
在使用 git pull 代码时,经常会碰到有冲突的情况,提示如下信息: error: Your local changes to 'c/environ.c' would be overwritten by merge . Aborting. Please, commit your changes or stash them before you can merge . 这个意思是说更新下来的内容...
整理了五种方法,我常用最后一种,这五种方法(除了第4中已经写了 fetch 的步骤)执行前都需要执行 git fetch 来同步远程仓库 (1) git checkout -b 本地分支名 origin/远程分支名 (2) git checkout --track origin/远程分支名 (这种写法是上面的简化版,效果完全一样) (3) git checkout -t origin/远程分支名(这种写法是2的简化版) (4) fetch 指定的一个分支: git fetch [repo] [remote_bra...
https://stackoverflow.com/questions/2088315/how-to-convert-a-regular-win32-vc-vcproj-project-to-a-qt-project 看看這個能不能幫到你