假设有两个人在git分支上工作,他们同时检出,但其中一个先提交然后另一个提交.最新的提交是否仍会与之前的提交合并,或者多个人可以同时在同一个分支上工作?
ara*_*nid 38
那么,当你克隆一个git存储库(那就是"check out"的意思吗?)时,你就是在有效地创建一个新的分支.Git分支是每个存储库的本地分支,而不是全局的.话虽如此,您有一个协议,用于如何在存储库之间传输分支更新 - 当您从远程执行时,默认情况下,远程的"主"分支将合并到您的"主"分支中.当您按下时,您的"主"分支可以附加到遥控器的主分支.因此,您的主人和远程主人("origin/master",如果您愿意)是不同的分支,但按惯例相关.
回到这一点---你注意到我说当你推到遥控器时可以附加你的主分支.如果两个人已经获得了原产地/主人的副本并进行了独立更改(记住这就像在本地对两个分支进行更改一样),一旦一个人推动他们的更改,另一个人的更改不是简单附加到原点/掌握了 - 他们必须合并.当你推动时,这种情况不会发生,只有当你拉动时(令人困惑的是,"拉"与"推"不完全相反:"提取"与推动相反 - 拉动是一个提取,然后是合并(或一个变种)).
因此,如果您处于这种情况,那么首先尝试推送更改的人需要从更新的origin/master中撤回,合并或重新绑定他们的master版本,然后推送.默认情况下,您无法删除某人对分支的更改并将其替换为您自己的更改:您至少需要执行"git push -f"来执行此操作,并且远程存储库可以具有设置或挂钩以使其更加困难.
或者他们两个可以事先合作:其中一个拉动另一个的变化,进行合并,然后推动结果.如果变化可能会重叠或相互影响,这可能是一件好事.记住版本控制系统的第一定律:VCS不是通信的替代品.
在Git中,分支是严格本地的.一个开发人员无法更改另一个开发人员的远程分支(请参阅底部的注释).但是,对于裸存储库,如果更改将导致快速更新,则可以"推送"对其的更改以更新远程存储库的分支.
但是,如果两个开发人员提交到同一个远程存储库,那么只有一个开发人员能够快速转发远程分支,而无需先将其分支恢复到最新状态.
例如,假设Alice和Bob都在其本地存储库中的主分支上工作,每个存储库都从服务器上的共享(裸)存储库中克隆.如果Alice首先完成了她的工作,当她将提交的更改推送到共享的裸存储库时,它将快速转发裸仓库的主分支.
现在Bob无法在没有首先更新其本地分支的情况下快速转发裸仓库的主分支,以包括Alice添加的提交(因为他添加的提交不是Alice创建的提交的祖先).
Bob可以做到这一点的一种方法是在Alice推送她的提交后从裸仓库中拉出(或者最好是rebase).这将Alice的更改合并到Bob的分支中,并使Bob可以通过推送快速转发裸仓库的主分支.
其他工作流程是可能的:Alice和Bob可以在不使用共享裸存储库的情况下直接相互协作.真的,几乎有无穷无尽的可能性.但总的来说,通过拉动变化来完成Git的合并.
[注意:它实际上可以推入非裸存储库,从而更新其他人的分支,但这通常会产生不直观的结果,不被视为典型的git工作流,并且通常不被鼓励]
一个较短的答案是:
commit -m "my changes"
Run Code Online (Sandbox Code Playgroud)
检索共享版本
git fetch sharedrepo
Run Code Online (Sandbox Code Playgroud)
这两个中的一个用于将本地分支与其他仓库同步
git merge sharedrepo/sharedbranch
git rebase sharedrepo/sharedbranch
Run Code Online (Sandbox Code Playgroud)
如果您不希望在最终历史记录中有很多分支,则Rebase会对历史记录进行序列化.这两个选项可能会强制您在完成之前解决冲突.
合并/重组和解决冲突后,你会回到repo
git push sharedrepo HEAD:sharedbranch
Run Code Online (Sandbox Code Playgroud)
不要在这里使用-f,因为这应该是一个快进.如果你运气不好,别人可能会推出一个新版本.如果发生这种情况,请重新启动此过