2013-08-27 39 views
3

我有一个回购建立在GitHub上,与Dev分支,这是我用克隆我的本地机器:分公司合并为自上混帐推

git clone https://github.... 

我然后切换到使用我的Dev分支:

git checkout -b Dev 

然后我拉只是为了确保一切是最新的

git pull origin Dev 

我现在在我的Dev分支,写一些代码和广告d使用文件:

git add filename 

我然后提交使用:

git commit -m "message" 

我然后按使用:

git push origin Dev 

这工作都好。然后第二个用户出现并输入一些代码。与此同时,我正在处理单独的文件,但我们正在同一分支上工作。我像以前一样添加和提交。然而,当我尝试推,我收到以下内容:

To https://github.com/ex/ex.git ! [rejected]
Dev -> Dev (fetch first) error: failed to push some refs to ' https://github.com/ex/ex.git ' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first merge the remote changes (e.g., hint: 'git pull') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我这样做,因为它说,并执行:

git pull origin Dev 

然后我就可以像以前一样推,一切似乎都很好。然而,当我检查提交历史记录时,回到GitHub,我看到:

Merge branch 'Dev' of https://github.com/ex/ex into Dev 

其中我刚刚添加的提交。为什么会发生这种合并?我怎样才能阻止这种情况发生?

+0

'GIT中pull'基本上'GIT中取出; git merge' – knittl

回答

2

合并是需要的,因为你和你的第二个用户分歧;你们每个人都犯了一个共同基础的东西。恢复同步需要结合两条发展路径。

“合并提交”不会造成任何损害;它真的不值得担心。但是,如果你想避免它,经常保持清洁的历史,你执行:

git pull --rebase ... 

将重订新提交到无论是从资源库中拉出。历史将呈现线性。

这里是一个例子。具有两个分支信息库:

$ git log --oneline --graph --all  
* 678ea83 c 
| * 2c1e48f b 
|/ 
* 5836f6f a 

合并的结果是:

$ git merge dev 
Merge made by the 'recursive' strategy. 
0 files changed 
create mode 100644 b 
$ git log --oneline --graph --all 
* 6d50134 Merge branch 'dev' 
|\ 
| * 2c1e48f b 
* | 678ea83 c 
|/ 
* 5836f6f a 

可替换地,底垫的结果:

$ git rebase dev 
First, rewinding head to replay your work on top of it... 
Applying: c 
$ git log --oneline --graph --all 
* 89a3771 c 
* 2c1e48f b 
* 5836f6f a 
1

因为上次提交整合:

  • 你都得拉,因为开发@起源是“新”

  • 与您合并开发@起源于当地的开发上拉

  • 你的本地dev有一个提交,你最初想推到原点

  • finally dev @ origin was me与您的提交(因此开发与合并与dev)

+1

除此之外,你可能想''git pull --rebase''或者在配置文件中设置相应的标志。 – Wolf

+1

现在可以通过执行这些命令来防止所有项目:git config --global pull.rebase true for git> = 1.7.9或者git config --global branch.autosetuprebase always for git <1.7 0.9 – JamesWilson