使用Git将代码更新至特定提交

197

我想执行 git pull,但只拉取至特定提交记录。

 A->B->C->D->E->F (Remote master HEAD)

假设我的local master指向B,我想要拉取到E,该怎么做?

这不是拉取特定的提交,而是拉取到特定的提交。


1
可能是重复的问题:从远程git仓库中拉取特定提交 - Dan Getz
5
git fetchgit merge E:
  • git fetch:从远程仓库获取最新的代码和分支,但不会将它们合并到本地分支中。
  • git merge E:将名为E的分支合并到当前所在的本地分支。
- poke
我目前在B,但是我只想提取C、E 和 F。我想删除D。谢谢! - Frenkey
@Frenkey 你可以将主分支合并,然后移除最后三个提交记录,再挑选出最后的两个提交记录进行合并。另外,你也可以尝试使用交互式变基(rebase -i),以更加精细地控制 Git 合并。 - Ninja420
如何将提交下载为zip /存档文件:https://dev59.com/hWYr5IYBdhLWcg3wfKP_ - Monero Jeanniton
显示剩余2条评论
9个回答

217

git pull 就是先执行 git fetch,再执行 git merge。因此你可以这样做:

git fetch remote example_branch

git merge <commit_hash>


“Refer to this” 应该是什么意思? - brettwhiteman
@Brett 忘记发布链接了..已经完全删除了。 - unrealsoul007
@unrealsoul007 这将仅合并那个特定的提交,对吧?因此,要从B合并到E,命令应该是git merge <commit_hash C> <commit_hash D> <commit_hash E>,对吗? - Wim Feijen
11
git merge E将合并E以及其所有祖先CD(Git知道AB不需要合并,因为它们已经在你的分支中)。如果你只想要E的更改,那么你应该使用git cherry-pick E - neXus
当您还想更新远程分支的本地引用时,可以执行以下操作:git pull [remote] [remote-branch-or-commit]:refs/remotes/[remote]/[branch]例如,git pull origin b78741a5:refs/remotes/origin/develop 将会将您的远程分支 develop 的本地引用更新为远程提交哈希值 b78741a5 - Radon8472
显示剩余2条评论

35

首先,从远程仓库获取最新的提交。这不会影响您本地的分支。

git fetch origin

然后检出远程跟踪分支,并使用git log查看提交记录

git checkout origin/master
git log

获取你想要合并到主分支的提交哈希值(或只获取前 ~5 个字符),然后将该提交合并到主分支中。

git checkout master
git merge <commit hash>

1
我给你点了踩,因为这个方法并不能像广告中所说的那样工作。首先,使用你的方法“git fetch origin”,它会获取所有远程分支(特别是对于在有许多和大型分支的项目中工作的人来说,这一点应该明确指出)。其次,使用这种方法“git merge <commit hash>”如果你回到历史记录中,则不会将你的本地历史记录合并到所需的提交上。例如:你在本地提交100,你想要到达150,通过获取所有内容(远程HEAD位于100),这种方法是行不通的。 - Placeholder
1
如果对其他人来说不明显的话, git fetch origin 明确地获取 _origin_。 - erik258
2
这个完美地运作,并且比被接受的答案更好地解释了。 - walen
1
最佳答案,完美解决。 - Asfandyar Khan

29

你也可以拉取最新的提交,并撤消操作,直到你想要的提交为止:

git pull origin master
git reset --hard HEAD~1

请用您想要的分支替换master

使用git log查看您希望还原到哪个提交:

git log

个人而言,这种方法对我更有效。

基本上,这个方法是获取最新的提交,并手动逐个还原提交。使用 git log 来查看提交历史记录。

优点:像广告宣传的那样工作。您不必使用提交哈希或拉取不需要的分支。

缺点:您需要逐个还原提交。

警告:提交/存储所有本地更改,因为使用--hard将导致丢失它们。 自行承担风险!


3
我不知道为什么会有人点踩,这似乎是最简便的方法,而且只要你想要更新,简单的拉取就行了,不像其他答案那样复杂。 - Mauricio Pasquier Juan
不知道为什么没有更多的赞,唯一的缺点是你需要在回退之前去到HEAD - 如果你需要解决冲突,我不知道会发生什么。但这个解决方案允许使用git pull --rebase,并且与所说的相反,你可以直接重置到N个提交之前,使用git reset --hard HEAD~N(例如,对于3个提交,git reset --hard HEAD~3)。 - Stock Overflaw
5
你可以使用 git reset --hard SHA 命令将代码库重置到想要的提交状态,无需倒数计数。 - Visya

16
这对我有用:
git pull origin <sha>

例如。

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

这个命令会拉取28eb00、ff39e4及其之前的所有提交,但不会拉取f4d10ad。它允许使用"pull --rebase"命令,并尊重.gitconfig中的pull设置。这是因为你基本上将28eb00视为一个分支。

对于我正在使用的git版本,该方法需要完整的提交哈希值-不允许使用缩写或别名。您可以执行类似以下的操作:

[dbn src]$ git pull origin `git rev-parse origin/master^`

就 OP 的问题而言:git pull origin E。这样做的一个巨大优势是你不会拉取(也不会存储)不需要的历史记录。虽然我没有尝试过,但在执行获取和合并步骤后,你应该能够通过执行 git reset --hard E 来丢弃那些“未来的历史记录”。 - RJVB
这种方法对我很有效。 - Kirk Liemohn

8

我从这个视频中找到了更新的答案,原来被接受的答案对我没用。

如果还没有的话,首先使用以下命令从git中克隆最新的repo(或者使用SSH):git clone <项目的HTTPs链接>,然后使用以下命令切换到所需的分支:git checkout <分支名称>

使用以下命令:

git log

查看最新的提交记录。 复制特定提交的哈希值。然后使用以下命令:

git fetch origin <Copy paste the shal here>

按下回车键后。现在使用命令:
git checkout FETCH_HEAD

现在,这个特定的提交将可用于您的本地。更改任何内容并使用 git push origin <分支名称> 推送代码。就这些。

参考视频:点击这里


6
如果你想将特定提交的代码拉出到一个新分支中,可以使用这个命令:

git checkout -b <new_branch_name> <commit_hash>

首先,您需要执行git pull(拉取所有内容),然后再执行它。 - A.Casanova

1
如果您将一个提交合并到您的分支中,您应该获得这两个提交之间的所有历史记录。
请注意:
$ git init ./
在 /Users/dfarrell/git/demo/.git/ 中初始化了一个空的 Git 存储库。
$ echo 'a' > letter
$ git add letter
$ git commit -m 'Initial Letter'
[master (root-commit) 6e59e76] Initial Letter
 1 file changed, 1 insertion(+)
 create mode 100644 letter
$ echo 'b' >> letter
$ git add letter && git commit -m 'Adding letter'
[master 7126e6d] Adding letter
 1 file changed, 1 insertion(+)
$ echo 'c' >> letter; git add letter && git commit -m 'Adding letter'
[master f2458be] Adding letter
 1 file changed, 1 insertion(+)
$ echo 'd' >> letter; git add letter && git commit -m 'Adding letter'
[master 7f77979] Adding letter
 1 file changed, 1 insertion(+)
$ echo 'e' >> letter; git add letter && git commit -m 'Adding letter'
[master 790eade] Adding letter
 1 file changed, 1 insertion(+)
$ git log
commit 790eade367b0d8ab8146596cd717c25fd895302a
Author: Dan Farrell 
Date:   Thu Jul 16 14:21:26 2015 -0500
添加信件
commit 7f77979efd17f277b4be695c559c1383d2fc2f27 Author: Dan Farrell Date: Thu Jul 16 14:21:24 2015 -0500
添加信件
commit f2458bea7780bf09fe643095dbae95cf97357ccc Author: Dan Farrell Date: Thu Jul 16 14:21:19 2015 -0500
添加信件
commit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad Author: Dan Farrell Date: Thu Jul 16 14:20:52 2015 -0500
添加信件
commit 6e59e7650314112fb80097d7d3803c964b3656f0 Author: Dan Farrell Date: Thu Jul 16 14:20:33 2015 -0500
初始信件 $ git checkout 6e59e7650314112fb80097d7d3803c964b3656f $ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 注意:您处于“分离的 HEAD”状态。您可以四处看看,进行实验性更改并提交它们,也可以在此状态下放弃您所做的任何提交,而不会影响任何分支。
如果您想创建一个新分支以保留您创建的提交,则可以使用带有 checkout 命令的 -b(现在或以后)。例如:
git checkout -b new_branch_name HEAD 现在位于 7126e6d... 添加信件 $ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 切换到新分支 'B' $ git pull 790eade367b0d8ab8146596cd717c25fd895302a 致命:'790eade367b0d8ab8146596cd717c25fd895302a' 不似乎是 Git 存储库 致命:无法从远程存储库读取。
请确保您具有正确的访问权限并且存储库存在。 $ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27 更新 7126e6d..7f77979 快进 letter | 2 ++ 1 file changed, 2 insertions(+) $ cat letter a b c d

0

git log 用于检查本地分支与其他分支之间的差异

  git log
  git merge cuY2324X

然后通过切换到其他分支,在其中检出要将代码推送到特定提交的分支,使用至少6位提交来执行git merge


-1

简单明了

git pull origin <Commit-hash>


当您尝试获取单个提交并使用该提交中的更改替换本地文件时,此答案非常有用。任何其他提交或层次结构都将被忽略。 - Drk_alien

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