比较了一下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&
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...