msh*_*rir 99 git commit github
我正在与一个项目的另一个开发人员合作,我们正在使用Github作为我们的远程仓库.我在Mac上使用git 1.7.7.3,他在Windows上使用git 1.7.6.
这就是发生的事情
git pull.git push.随着时间的推移,提交日志中充斥着"合并分支"消息,并且还将开发人员B显示为提交开发人员A所做的更改.我们发现防止这个问题的唯一方法就是git pull --rebase在步骤3进行,但我不知道变形引起的副作用是什么.这是我第一次使用多开发人员git仓库,这是正常行为吗?有关如何解决这个问题的任何想法?
pok*_*oke 86
你看到的提交完全没问题.一个pull有效的运行git fetch,然后git merge所以当你运行一个合并通常发生git pull.
使用变基而不是合并的替代方案是可行的,但通常你应该避免使用.重新定位允许您保留线性历史记录,但也会删除有关最初发生的分支的任何信息.它还将导致重写当前分支的历史记录,重新创建目标分支中未包含的所有提交(在您的情况下,远程).由于重新创建的提交是不同的提交,因此在与其他人一起开发时会引起很多混乱,特别是当人们在重写之前已经检查了部分提交时(例如使用功能分支).因此,作为一个经验法则,你应该永远不会重写任何提交一个已经推.
您看到的提交可以组合两个(或更多)分支.提交除了合并多个分支之外什么都不做,完全没问题.实际上,当您在查看历史记录时进行合并提交并组合分支时,它会非常清楚.与变基相比,合并还允许您有效地查看原始历史,包括共存的实际分支.
所以,长话短说:是的,合并提交完全没问题,你不应该担心它们.
Bil*_*oor 46
由于我的理解,图表和结论不正确,因此修改了这个答案.
git pull导致合并提交,因为git正在合并.这可以通过将分支设置为使用rebase而不是merge来更改.在pull上使用rebase而不是merge为共享存储库提供了更线性的历史记录.另一方面,merge commits显示了分支上的并行开发工作.
例如,两个人正在同一个分支上工作.分支开头为:
...->C1
Run Code Online (Sandbox Code Playgroud)
第一个人完成他们的工作并推向分支机构:
...->C1->C2
Run Code Online (Sandbox Code Playgroud)
第二个人完成他们的工作,并希望推动,但不能因为他们需要更新.第二个人的本地存储库看起来像:
...->C1->C3
Run Code Online (Sandbox Code Playgroud)
如果将pull设置为merge,则第二个人员库将如下所示.
...->C1->C3->M1
\ /
->C2->
Run Code Online (Sandbox Code Playgroud)
其中M1是合并提交.这个新的分支历史将被推送到回购.相反,如果将pull设置为rebase,则本地repo将如下所示:
...->C1->C2->C3
Run Code Online (Sandbox Code Playgroud)
没有合并提交.历史变得更加线性.
两种选择都反映了分支的历史.git允许您选择您喜欢的历史记录.
确实存在rebase可能导致远程分支出现问题的地方.这不是其中之一.我们更喜欢使用rebase,因为它简化了已经很复杂的分支历史记录,并显示了相对于共享存储库的历史版本.
您可以设置branch.autosetuprebase = always让git自动将远程分支建立为rebase而不是master.
git config --global branch.autosetuprebase always
Run Code Online (Sandbox Code Playgroud)
此设置使git自动为每个远程分支创建配置设置:
branch.<branchname>.rebase=true
Run Code Online (Sandbox Code Playgroud)
您可以自己为已设置的远程分支设置此项.
git config branch.<branchname>.rebase true
Run Code Online (Sandbox Code Playgroud)
我要感谢@LaurensHolst提出质疑并继续我之前的发言.我当然学到了更多关于git如何使用pull和merge提交的知识.
有关合并的详细信息,提交你可以阅读使用项目在ProGit图书.在私人小团队部分显示合并的提交.
gab*_*ous 10
你可以做:
git pull --rebase
Run Code Online (Sandbox Code Playgroud)
但是,这将始终将您的更改置于协作者之上.但是你不会得到任何污染性的合并消息.
实际上有一个更简单的答案.让开发人员B在提交之前做一个拉动.这将阻止那些合并提交,因为它们是由您在本地提交的本地存储库上创建的历史记录导致的,该历史记录尝试与远程存储库上的提交历史记录合并.如果您在执行拉动时收到一条消息,说明"更改将被覆盖",则只表示您触摸了同一个文件,所以:
git stash
git pull
git stash pop
Run Code Online (Sandbox Code Playgroud)
那么你可以解决任何合并冲突,如果有的话.
做一个git pull会插入"Merge branch"消息,这正是它所做的.通过执行git pull,您已将远程分支合并到本地分支中.
当您执行git pull并且存在冲突时,git日志将显示冲突文件的更新来自解决冲突的用户.我假设这是因为修复冲突的人重新提交文件.
据我所知,这就是git的工作方式,而且没有办法解决它.
重新定位将吹走git历史记录,因此您将无法看到合并发生的时间.
| 归档时间: |
|
| 查看次数: |
44561 次 |
| 最近记录: |