Git拉到特定的提交

Nin*_*420 68 git github

我想做一个git pull但只有特定的提交.

 A->B->C->D->E->F (Remote master HEAD)
Run Code Online (Sandbox Code Playgroud)

假设我的local masterHEAD指向B,我想拉到E.我该怎么办 ?

这不是一个特定的提交,这是一个特定的提交.

unr*_*007 76

git pull只不过是git fetch随之而来的git merge.所以你能做的就是

git fetch remote example_branch

git merge <commit_hash>

  • @WimFeijen`git merge E`将合并`E`及其所有祖先C`和`D`(git知道`A`和`B`不需要合并,因为它们已经在您的分支中了) 。如果只想更改E,则应该改用git cherry-pickE。 (3认同)

Pla*_*der 19

您还可以拉取最新的提交并撤消直到您想要的提交:

git pull origin master
git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)

替换master为您想要的分支。

使用 git log 来查看您要还原到哪个提交:

git log
Run Code Online (Sandbox Code Playgroud)

就个人而言,这对我更有效。

基本上,它的作用是拉取最新的提交,然后您手动一一还原提交。使用 git log 来查看提交历史。

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

缺点:您需要一次还原提交。

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

  • 你可以执行“git reset --hard SHA”,它会将其重置为你想要的提交,无需倒数。 (7认同)
  • 我不知道为什么投反对票,这似乎是最干净的方式,只要您想了解最新情况,就可以进行简单的拉动,这与其他一些答案不同 (3认同)

dev*_*bmw 15

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

git fetch origin
Run Code Online (Sandbox Code Playgroud)

然后检查远程跟踪分支并执行git日志以查看提交

git checkout origin/master
git log
Run Code Online (Sandbox Code Playgroud)

获取要合并的提交的提交哈希值(或者只是它的前5个字符)并将该提交合并到master中

git checkout master
git merge <commit hash>
Run Code Online (Sandbox Code Playgroud)

  • @Placeholder你应该在写这样的废话之前阅读`git fetch`的手册.除此之外,您应该阅读原始问题和我的答案.如果你按照我的回答那么你将不会"回到历史中",因为我明确地指示用户`git checkout master`.总的来说,如果您对自己的工作至少有50%的了解,请不要发布内容. (5认同)
  • 这完美地工作并且比接受的答案更好地解释。 (2认同)

Tri*_*leM 9

我从此视频中找到了更新的答案,接受的答案对我不起作用。

首先使用(或使用 SSH)从 git 克隆最新的存储库(如果没有 git clone <HTTPs link of the project> ),然后使用 转到所需的分支 git checkout <branch name>

使用命令

git log
Run Code Online (Sandbox Code Playgroud)

检查最新的提交。复制特定提交的 shal。然后使用命令

git fetch origin <Copy paste the shal here>
Run Code Online (Sandbox Code Playgroud)

按回车键后。现在使用命令

git checkout FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)

现在,特定的提交将可供您的本地使用。更改任何内容并使用 推送代码git push origin <branch name>。就这样。检查视频以供参考。


dbn*_*dbn 6

这对我有用:

git pull origin <sha>
Run Code Online (Sandbox Code Playgroud)

例如

[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.
...
Run Code Online (Sandbox Code Playgroud)

这会拉取 28eb00、ff39e4 和之前的所有内容,但不会拉取 f4d10ad。它允许使用 pull --rebase,并尊重 gitconfig 中的 pull 设置。这是有效的,因为您基本上将 28eb00 视为一个分支。

对于我使用的 git 版本,此方法需要完整的提交哈希 - 不允许使用缩写或别名。你可以这样做:

[dbn src]$ git pull origin `git rev-parse origin/master^`
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您想将特定提交的代码拉取到新分支,可以使用以下命令:

git checkout -b <new_branch_name> <commit_hash>
Run Code Online (Sandbox Code Playgroud)