Git拉到特定的提交

时间:2015-07-16 19:16:11

标签: git github

我想做一个git pull,但只到特定的提交。

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

所以假设我的local master HEAD指向B,我想拉到E。我该怎么办?

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

7 个答案:

答案 0 :(得分:60)

git pull只是git fetch后跟git merge。所以你能做的就是

git fetch remote example_branch

git merge <commit_hash>

答案 1 :(得分:11)

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

git fetch origin

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

git checkout origin/master
git log

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

git checkout master
git merge <commit hash>

答案 2 :(得分:1)

如果将提交合并到您的分支中,您应该获得它们之间的所有历史记录。

观察:

$ git init ./
Initialized empty Git repository in /Users/dfarrell/git/demo/.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

    Adding letter

commit 7f77979efd17f277b4be695c559c1383d2fc2f27
Author: Dan Farrell 
Date:   Thu Jul 16 14:21:24 2015 -0500

    Adding letter

commit f2458bea7780bf09fe643095dbae95cf97357ccc
Author: Dan Farrell 
Date:   Thu Jul 16 14:21:19 2015 -0500

    Adding letter

commit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Author: Dan Farrell 
Date:   Thu Jul 16 14:20:52 2015 -0500

    Adding letter

commit 6e59e7650314112fb80097d7d3803c964b3656f0
Author: Dan Farrell 
Date:   Thu Jul 16 14:20:33 2015 -0500

    Initial Letter
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Note: checking out '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 7126e6d... Adding letter
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Switched to a new branch 'B'
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
fatal: '790eade367b0d8ab8146596cd717c25fd895302a' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Updating 7126e6d..7f77979
Fast-forward
 letter | 2 ++
 1 file changed, 2 insertions(+)
$ cat letter
a
b
c
d

答案 3 :(得分:1)

我从this video找到了最新答案,接受的答案对我不起作用。

首先使用以下命令从git(如果尚未克隆)中克隆最新的仓库 git clone <HTTPs link of the project> (或使用SSH),然后使用 git checkout <branch name>

使用命令

git log

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

git fetch origin <Copy paste the shal here>

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

git checkout FETCH_HEAD

现在特定的提交将对您的本地用户可用。进行任何更改,然后使用git push origin <branch name>推送代码。就这样。 检查the video以供参考。

答案 4 :(得分:0)

您也可以提取最新的提交,然后撤消直到您想要的提交:

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

master 替换为您想要的分支。

使用git log查看要恢复的提交:

git log

就个人而言,这对我有用。

基本上,它的作用是提取最新的提交,然后手动逐个恢复提交。使用git log查看提交历史记录。

好点:按宣传方式工作。您不必使用提交哈希或拉不需要的分支。

错误点:您需要将提交还原为一个。

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

答案 5 :(得分:0)

这对我有用:

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^`

答案 6 :(得分:0)

git log 检查本地和其他分支之间的差异

  git log
  git merge cuY2324X

然后 git merge 到特定的或特定的提交,通过检出到您想要将代码推送到特定提交的其他分支并使用至少 6 位提交