我应该先进行推送还是拉取?

4
请想象一下:
我和我的同事正在主分支上工作。我改变了代码(添加和删除)。同时,我的同事也做了一些更改并将一个提交推到了主分支。
现在,我的当前工作目录与主分支不同,并且我想保留主分支和我的工作目录中的所有更改。
在这种情况下,我应该怎么做?
如果我进行推送,主分支将与我的工作目录相同(我的同事的更改将消失)。如果我先进行拉取,那么我的所有更改都会消失。无论如何,我该如何处理这种情况?

5
如果你进行了代码的“pull”,你所做的更改并不会丢失,它们会被“合并”进去。 - eftshift0
1
@Edmundo 真的吗?我必须先进行一次拉取吗? - stack
2
git pull origin(或其他仓库名称)。https://git-scm.com/docs/git-pull - eftshift0
1
@Edmundo 我明白了,谢谢。*(但是我还是害怕运行那个命令,因为我不能再重写所有的更改)* - stack
1
根据您的设置,pull 等同于 fetch+merge(默认)或 fetch+rebase - 因此默认情况下它会从主分支获取新内容,然后将其与您的内容合并,如果存在冲突,则可能会出现冲突。 - birdspider
显示剩余6条评论
4个回答

6
使用Git进行版本控制,你和同事的更改都不会轻易丢失。一旦提交了更改,就需要花费一些努力才能真正删除已提交的更改。这是Git最美妙的方面之一。
在你所描述的情况下,无论如何你都无法推送,因为Git会检测到远程存储库中存在本地存储库中不存在的更改。你需要获取这些更改,然后将它们合并或将自己的更改重新基于从远程存储库获取的更改。
为了简化操作,你应该执行git pull命令。如果可能的话,Git会自动将同事的更改合并到你的工作副本中。如果同事和你自己的更改以一种更复杂的方式发生冲突,你将不得不手动合并更改。但如果你们两个都遵循结构化的Git工作流程,这种情况实际上应该不会经常发生。

4

假设您已经在本地提交了代码,您应该首先执行:

git pull origin master --rebase

这将从远程获取代码并进行变基。完成后,只需将代码推回到远程即可。

git push origin master

使用 --rebase 是强制性的吗?如果我不使用它会发生什么?它到底是做什么的? - Martin AJ
@MartinAJ 不是必须的 --rebasegit pullgit fetchgit merge 的组合。--rebase只是使用 rebase 而不是 merge。因此,最终,一切取决于您对合并与变基的偏好。个人而言,在有许多提交和冲突时更喜欢使用合并,在分支仅存在几个简单提交时则更喜欢使用变基。 - Nerve

0

git pull 命令会使用给定的参数运行 git fetch 命令,并调用 git merge 命令将检索到的分支头合并到当前分支中。

source

先 Pull。这是版本控制系统的优势,您的贡献不会丢失。它允许大团队同时在代码上工作。


0

在我们将更改推送到您的 git-hub 分支之前,我们需要确保本地仓库已经包含了所有已经在 git-hub 上进行的更改。正确的下一步是拉取(pull)。这可以通过以下两种方式之一完成:

  1. 传统的 pull:合并命令将远程更改与本地更改相结合。这将添加一个新的提交,而且变更列表应该显示出分离的开发线路已经重新汇合。

  2. Pull+rebase:如果我们勾选了 re-base 选项,Hg/Git 将暂时撤销(“倒带”)任何新的本地提交所做的更改,fast-forward 以使本地分支与远程分支完全相同,然后将本地的 changes/commits 重新播放到分支的新 HEAD 上。这将更改您本地提交的时间戳,但变更列表应该显示出所有更改都是按照线性顺序发生的。无论哪种情况,如果我们恰好更改了重叠的代码片段,则有可能需要解决冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接