强制更新后Git拉

ibl*_*lue 290 git git-pull

我只是压缩了一些提交git rebase并做了一个git push --force(这是邪恶的,我知道).

现在其他软件工程师有不同的历史,当他们这样做时git pull,Git会合并.有没有办法解决这个问题,除了做一个rm my-repo; git clone git@example.org:my-repo.git

我需要与之相反的东西git push --force,但git pull --force没有给出预期的结果.

AD7*_*six 459

接收新提交

git fetch
Run Code Online (Sandbox Code Playgroud)

重启

您可以使用重置本地分支的提交git reset.

要更改本地分支的提交:

git reset origin/master --hard
Run Code Online (Sandbox Code Playgroud)

但请注意,正如文档所述:

重置索引和工作树.自<commit>以来对工作树中跟踪文件的任何更改都将被丢弃.

如果你想真正保留你在本地获得的任何改变 - 请--soft改为重置.这将更新分支的提交历史记录,但不会更改工作目录中的任何文件(然后您可以提交它们).

变基

您可以使用git rebase以下任意方式在任何其他提交/分支上重播本地提交:

git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)

这将在交互模式下调用rebase,您可以在其中选择如何应用不在您重新定位的历史记录中的每个单独提交.

如果您删除的提交(with git push -f)已经被拉入本地历史记录,它们将被列为将被重新应用的提交 - 它们将需要作为rebase的一部分被删除,或者它们将被简单地重新包含在历史记录中对于分支 - 并在下一次推送时重新出现在远程历史中.

git command --help有关上述(或其他)任何命令的更多详细信息和示例,请使用帮助.

  • 如果他们已经做了一些本地提交怎么办? (4认同)
  • 可能值得一提的是,如果这是针对不同的分支:`git reset origin/otherbranch --hard` (4认同)
  • @iblue在丢失所有更改,删除提交历史记录但保留文件更改或尝试将每个提交应用于新文件头之间进行选择。最简单的选项可能是软复位。 (2认同)
  • @PlasmaBinturong号`git reset --soft origin / master`将更改提交历史记录,以匹配远程和阶段差异到要提交的远程。在这种情况下,无需重新设置基准(由于未提交更改,因此您将无法这样做),因为提交历史记录没有差异。这两个选项是“重置”或“变基”的,而不是两者的组合。如果您的方案与我在这里回答的方案不同,请[提出问题](/sf/)。 (2认同)

her*_*man 45

拉动变基

常规拉取是 fetch + merge,但您想要的是 fetch + rebase。这是pull命令的一个选项:

git pull --rebase
Run Code Online (Sandbox Code Playgroud)

  • 我没有调查过,但我_认为_只有在添加新提交而不是删除或更改旧提交的情况下,这才能正常工作。(比如说,如果一个分支重新基于另一个分支,或者提交的顺序发生了更改。)否则,您最终将重新添加已删除的提交。我认为这就是需要“git重置”的原因。 (3认同)
  • 我一直使用它来将最新代码从 master 获取到我的功能分支中,而无需将所有这些合并提交记录在历史记录中。 (2认同)
  • 这比 `git reset origin/master --hard` 或 `git rebase origin/master` 要简单得多,特别是在没有本地提交的情况下。谢谢! (2认同)

Tom*_*ats 15

这不会修复已经拥有你不想要的代码的分支(参见下面有关如何做到这一点),但如果他们已经拉出了一些分支,现在希望它是干净的(而不是"超前") origin/some-branch)那么你只需:

git checkout some-branch   # where some-branch can be replaced by any other branch
git branch base-branch -D  # where base-branch is the one with the squashed commits
git checkout -b base-branch origin/base-branch  # recreating branch with correct commits
Run Code Online (Sandbox Code Playgroud)

注意:您可以通过在它们之间放置&&来组合这些

注2:弗洛里安在评论中提到了这一点,但在寻找答案时谁会阅读评论?

注3:如果你有污染的分支,你可以根据新的"哑分支"创建新的分支,只是樱桃选择提交.

例如:

git checkout feature-old  # some branch with the extra commits
git log                   # gives commits (write down the id of the ones you want)
git checkout base-branch  # after you have already cleaned your local copy of it as above
git checkout -b feature-new # make a new branch for your feature
git cherry-pick asdfasd   # where asdfasd is one of the commit ids you want
# repeat previous step for each commit id
git branch feature-old -D # delete the old branch
Run Code Online (Sandbox Code Playgroud)

现在,feature-new是你的分支,没有额外的(可能是糟糕的)提交!


Gay*_*tti 13

要将更改从远程存储库获取到本地存储库:

git fetch --all
Run Code Online (Sandbox Code Playgroud)

重命名跟踪分支:

git branch -m <old-branch-name> <new-name>
Run Code Online (Sandbox Code Playgroud)

创建一个新的本地分支来跟踪远程分支:

git checkout <old-branch-name>
Run Code Online (Sandbox Code Playgroud)