Gitを使用して、ローカルとリモート間の変更を見つける方法

StackOverflow https://stackoverflow.com/questions/231211

  •  04-07-2019
  •  | 
  •  

質問

ここには2つの異なる質問がありますが、それらは関連していると思います。

  1. Gitを使用する場合、ローカルでコミットしたが、まだリモートブランチにプッシュしていない変更を見つけるにはどうすればよいですか? Mercurialコマンド hg outgoing に似たものを探しています。

  2. Gitを使用する場合、プルを実行する前にリモートブランチに加えられた変更を見つけるにはどうすればよいですか? Mercurialコマンド hg incoming に似たものを探しています。

2番目:利用可能なものを確認し、プルしたい変更をチェリーピックする方法はありますか?

役に立ちましたか?

解決

Hitのように、Gitはそのような情報をネットワーク経由で送信できません。ただし、 git fetch hg fetch よりも hg pull )を実行して、リモートサーバーから新しいコミットを取得できます。

したがって、 master というブランチと origin というリモートがある場合、 git fetch を実行した後、ブランチも必要です。 origin / master と呼ばれます。その後、 git log masterを実行することにより、 master origin / master のスーパーセットである必要があるすべてのコミットの git log を取得できます。 ..origin / master 。これら2つを逆にして逆にします。

私の友人であるDavid Dollarは、 hg incoming / outgoing をシミュレートするために、いくつかのgitシェルスクリプトを作成しました。それらは http://github.com/ddollar/git-utils で見つけることができます。

他のヒント

Git 1.7.0以降では、一般的に上流ブランチを参照できる特別な構文があります: @ {u} または @ {upstream}

hg着信を模倣するには:

git log ..@{u}

hg発信を模倣するには:

git log @{u}..

次の incoming および outgoing エイリアスを使用して、上記を使いやすくします。

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

完全な回答ではありませんが、git fetchはリモートリポジトリをプルし、マージを行いません。 その後、

git diff master origin/master

を実行できます
  1. " git log origin..HEAD"を使用

  2. " git fetch"を使用その後に「git log HEAD..origin」が続きます。リストされたコミットIDを使用して、個々のコミットをチェリーピックできます。

もちろん、上記は「起源」を想定しています。は、リモート追跡ブランチの名前です(デフォルトオプションでcloneを使用した場合)。

すべてのブランチを比較するためのこれもあります:

git log --branches --not --remotes=origin

これはgit logのmanページでこれについて書かれています:

  

のいずれかにあるすべてのコミットを表示します   ローカルブランチはありますが、   オリジンのリモート追跡ブランチ   (あなたがその起源を持っているものはありません’ t)。

上記は発信用です。 incoming の場合、スワップするだけです:

git log --remotes=origin --not --branches

やる

$ git fetch --dry-run

hg incoming および

$ git push --dry-run

hg発信の場合。

git-out hg outgoing を非常に正確にエミュレートするスクリプトです。 " push -n"で解析します。出力。プッシュする追加の引数を指定する必要がある場合、正確な出力が生成されます。

git着信

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git outgoing

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

" git log" @ {u}の回答により、最初は「不明なリビジョン」と判断されました。エラー、Chris / romkynsの git push --dry-run の提案を試しました。

「5905..4878 master-> master」などの出力が表示されます。 5905は、リモートが持っている最新のコミットであり、4878を介した(および含む)コミットはリモートに適用されます。

その後、5905..4878を他のいくつかのgitコマンドの引数として使用して、詳細を取得できます。

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

git fetchを実行すると、ブランチ、タグ(refs)を含むすべてのコンテンツが一時的に.git / FETCH_HEADに保存され、そのコンテンツはコマンドで表示できます: git log FETCH_HEAD git fetchでサフィックス-aを使用しない場合、デフォルトでは、FETCH_HEADのコンテンツは新しいコンテンツで上書きされます。 これらのコンテンツから、マージするブランチを表示して決定したり、フェッチによってもたらされたコミットからほんの数件のコミットが必要な場合は単純なチェリーピックを選択したりできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top