特定のコミットまでGitプル


105

私はやりたいのですgit pullが、特定のコミットまでだけです。

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

だから私の頭がをlocal master指していると仮定し、私はBまで引っ張りたいと思いEます。私は何をすべきか ?

これは特定のコミットをプルしているのではなく、特定のコミットまでプルアップしています。



3
git fetchおよびgit merge E
2015

たとえば、現在Bにいますが、C、E、Fのみをプルしたいのです。Dを削除したいのです。ありがとうございます。
フレンキー

@Frenkeyマスターをマージしてから、最後の3つのコミットを削除してから、最後の2つをチェリーピックすることができます。また、より制御されたgitマージのためにrebase -iを試すことができます
Ninja4 2019

Cからの変更のみをフェッチしたい場合、AとBの変更をCだけに含めないでください。どうやってやるの?
VikasChauhan20年

回答:


119

git pullgit fetch後に続くだけgit mergeです。だからあなたができることは

git fetch remote example_branch

git merge <commit_hash>


「これを参照してください」とは何ですか?
developerbmw

@Brettリンクを投稿するのを忘れました..完全に削除しました
unrealsoul007 2015

@ unrealsoul007これは、その1つの特定のコミットだけをマージしますか?したがって、BからEにプルするには、コマンドはgit merge <commit_hash C> <commit_hash D> <commit_hash E>になりますよね?
Wim Feijen 2017年

7
@WimFeijenがgit merge EマージされますE、そのすべての祖先と一緒にCしてD(gitのはそれを知っているAし、B彼らはあなたのブランチに存在していたため、マージする必要はありません)。の変更のみEが必要な場合は、git cherry-pick E代わりに行う必要があります。
NEXUS

答えてくれてありがとう、私は同じ問題を探していました。
AkashBisariya20年

24

まず、リモートリポジトリから最新のコミットをフェッチします。これはローカルブランチには影響しません。

git fetch origin

次に、リモートトラッキングブランチをチェックアウトし、gitログを実行してコミットを確認します

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になっている)。
プレースホルダー

8
@Placeholdergit fetchそのようなナンセンスを書く前に、マニュアルを読む必要があります。さらに、元の質問と私の答えを読む必要があります。私の答えに従うと、ユーザーに明示的に指示するので、「履歴に戻る」ことはありませんgit checkout master。全体として、自分の行動について少なくとも50%明確でない場合は、投稿しないでください。
developerbmw

1
他の人には明らかでない場合は、git fetch origin明示的にoriginをフェッチします。
ダニエルファレル

2
これは完全に機能し、受け入れられた答えよりもよく説明されています。
walen

1
ベストアンサー、完璧に機能
AsfandyarKhan20年

14

最新のコミットをプルして、必要なコミットまで元に戻すこともできます。

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

master目的のブランチに置き換えます。

git logを使用して、どのコミットに戻したいかを確認します。

git log

個人的には、これは私にとってよりうまくいきました。

基本的に、これは最新のコミットをプルし、手動でコミットを1つずつ元に戻します。コミット履歴を表示するには、gitlogを使用します。

良い点:宣伝どおりに機能します。コミットハッシュを使用したり、不要なブランチをプルしたりする必要はありません。

悪い点:コミットを1つ戻す必要があります。

警告:ローカルの変更はすべてコミット/スタッシュします。これを使用すると、変更--hardが失われるためです。自己責任!


3
なぜ反対票を投じるのかはわかりませんが、これが最もクリーンな方法のようです。他の回答とは異なり、最新の情報を入手したい場合はすぐに簡単にプルできます
Mauricio PasquierJuan19年

なぜもっと賛成しないのか、唯一の欠点は、HEAD戻る前に行く必要があるということです-そして、あなたが対立を解決しなければならなかった場合、私は何が起こるかわかりません。しかし、このソリューションはを可能にしgit pull --rebase、言われていることに反して、N前のコミットに直接リセットすることができますgit reset --hard HEAD~N(つまり、3つのコミットの場合git reset --hard HEAD~3)。
在庫超過

あなたがすることができgit reset --hard SHA、それはあなたが望むコミットにそれをリセットします、逆に数える必要はありません。
Visya

2

コミットをブランチにマージする場合、その間のすべての履歴を取得する必要があります。

観察する:

$ git init ./
/Users/dfarrell/git/demo/.git/に空のGitリポジトリを初期化しました
$ echo'a '>文字
$ git追加文字
$ git commit -m '初期文字'
[マスター(ルートコミット)6e59e76]頭文字
 1つのファイルが変更され、1つの挿入(+)
 作成モード100644レター
$ echo'b '>>文字
$ git add letter && git commit -m '文字の追加'
[マスター7126e6d]手紙を追加する
 1つのファイルが変更され、1つの挿入(+)
$ echo'c '>>文字; git add letter && git commit -m '文字の追加'
[マスターf2458be]手紙を追加する
 1つのファイルが変更され、1つの挿入(+)
$ echo'd '>>文字; git add letter && git commit -m '文字の追加'
[マスター7f77979]手紙を追加する
 1つのファイルが変更され、1つの挿入(+)
$ echo'e '>>文字; git add letter && git commit -m '文字の追加'
[マスター790eade]手紙を追加する
 1つのファイルが変更され、1つの挿入(+)
$ gitログ
コミット790eade367b0d8ab8146596cd717c25fd895302a
著者:ダンファレル 
日付:2015年7月16日木曜日14:21:26 -0500

    手紙を追加する

コミット7f77979efd17f277b4be695c559c1383d2fc2f27
著者:ダンファレル 
日付:2015年7月16日木曜日14:21:24 -0500

    手紙を追加する

コミットf2458bea7780bf09fe643095dbae95cf97357ccc
著者:ダンファレル 
日付:2015年7月16日木曜日14:21:19 -0500

    手紙を追加する

コミット7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
著者:ダンファレル 
日付:2015年7月16日木曜日14:20:52 -0500

    手紙を追加する

コミット6e59e7650314112fb80097d7d3803c964b3656f0
著者:ダンファレル 
日付:2015年7月16日木曜日14:20:33 -0500

    頭文字
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
注:「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を更新しています
早送り
 手紙| 2 ++
 1つのファイルが変更され、2つの挿入(+)
$猫の手紙
a
b
c
d

1

このビデオから更新された回答を見つけましたが、受け入れられた回答は私には機能しませんでした。

まず、git clone <HTTPs link of the project> (またはSSHを使用して)gitから最新のリポジトリのクローンを作成 しgit checkout <branch name> ます。次に、を使用してdesireブランチに移動し ます。

コマンドを使用する

git log

最新のコミットを確認します。特定のコミットのshalをコピーします。次に、コマンドを使用します

git fetch origin <Copy paste the shal here>

Enterキーを押した後。コマンドを使用します

git checkout FETCH_HEAD

これで、特定のコミットがローカルで利用できるようになります。何かを変更し、を使用してコードをプッシュしますgit push origin <branch name>。それで全部です。参照用にビデオを確認してください。


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のプル設定が尊重されます。これは、基本的に28eb00をブランチとして扱っているために機能します。

私が使用しているバージョンのgitの場合、このメソッドには完全なコミットハッシュが必要です。省略形やエイリアスは使用できません。あなたは次のようなことをすることができます:

[dbn src]$ git pull origin `git rev-parse origin/master^`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.