用git提交到同一个分支

jar*_*ras 21 git branch

假设有两个人在git分支上工作,他们同时检出,但其中一个先提交然后另一个提交.最新的提交是否仍会与之前的提交合并,或者多个人可以同时在同一个分支上工作?

ara*_*nid 38

那么,当你克隆一个git存储库(那就是"check out"的意思吗?)时,你就是在有效地创建一个新的分支.Git分支是每个存储库的本地分支,而不是全局的.话虽如此,您有一个协议,用于如何在存储库之间传输分支更新 - 当您从远程执行时,默认情况下,远程的"主"分支将合并到您的"主"分支中.当您按下时,您的"主"分支可以附加到遥控器的主分支.因此,您的主人和远程主人("origin/master",如果您愿意)是不同的分支,但按惯例相关.

回到这一点---你注意到我说当你推到遥控器时可以附加你的主分支.如果两个人已经获得了原产地/主人的副本并进行了独立更改(记住这就像在本地对两个分支进行更改一样),一旦一个人推动他们的更改,另一个人的更改不是简单附加到原点/掌握了 - 他们必须合并.当你推动时,这种情况不会发生,只有当你拉动时(令人困惑的是,"拉"与"推"不完全相反:"提取"与推动相反 - 拉动是一个提取,然后是合并(或一个变种)).

因此,如果您处于这种情况,那么首先尝试推送更改的人需要从更新的origin/master中撤回,合并​​或重新绑定他们的master版本,然后推送.默认情况下,您无法删除某人对分支的更改并将其替换为您自己的更改:您至少需要执行"git push -f"来执行此操作,并且远程存储库可以具有设置或挂钩以使其更加困难.

或者他们两个可以事先合作:其中一个拉动另一个的变化,进行合并,然后推动结果.如果变化可能会重叠或相互影响,这可能是一件好事.记住版本控制系统的第一定律:VCS不是通信的替代品.

  • "VCS不是通信的替代品." 这可能是我整周读过的最好的评论. (19认同)
  • @araqnid:我认为它并不是真的那么顺利。我要求我的团队使用相同的分支来添加他们各自的代码,显然 GitHub 没有显示拉取请求中第一个人的更改(这看起来像是因为两个人同时将代码添加到同一个文件中而发生的),您只能看到第二个人的代码。与Master合并后,它完全排除了第一人称的代码。 (2认同)

Dan*_*ing 8

在Git中,分支是严格本地的.一个开发人员无法更改另一个开发人员的远程分支(请参阅底部的注释).但是,对于存储库,如果更改将导致快速更新,则可以"推送"对其的更改以更新远程存储库的分支.

但是,如果两个开发人员提交到同一个远程存储库,那么只有一个开发人员能够快速转发远程分支,而无需先将其分支恢复到最新状态.

例如,假设Alice和Bob都在其本地存储库中的主分支上工作,每个存储库都从服务器上的共享(裸)存储库中克隆.如果Alice首先完成了她的工作,当她将提交的更改推送到共享的裸存储库时,它将快速转发裸仓库的主分支.

现在Bob无法在没有首先更新其本地分支的情况下快速转发裸仓库的主分支,以包括Alice添加的提交(因为他添加的提交不是Alice创建的提交的祖先).

Bob可以做到这一点的一种方法是在Alice推送她的提交后从裸仓库中拉出(或者最好是rebase).这将Alice的更改合并到Bob的分支中,并使Bob可以通过推送快速转发裸仓库的主分支.

其他工作流程是可能的:Alice和Bob可以在不使用共享裸存储库的情况下直接相互协作.真的,几乎有无穷无尽的可能性.但总的来说,通过拉动变化来完成Git的合并.

[注意:它实际上可以推入非裸存储库,从而更新其他人的分支,但这通常会产生不直观的结果,不被视为典型的git工作流,并且通常不被鼓励]


rob*_*inr 6

一个较短的答案是:

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,因为这应该是一个快进.如果你运气不好,别人可能会推出一个新版本.如果发生这种情况,请重新启动此过