web-dev-qa-db-ja.com

Git:すべてのローカルコミットをリモートリポジトリバージョンと比較する

私はGitにいくらか慣れていないので、私がやろうとしていることは可能なはずです。基本的に私はレポジトリのクローンに取り組んでおり、かなりの数のローカルコミットを行ってきました。すべての変更の「合計」と元のレポバージョンの差分を表示する方法はありますか? Pushを実行するとGitが基本的にこれを行うため、これが可能になると思います。

ここに私がやろうとしていることの例があります:gitkでは次のようなものが表示されます:
*-[mybranch] answer.txtの末尾に「42」を追加しました(ローカルコミット)
*-my.txtの末尾に「Hello World」を追加しました(ローカルコミット)
*-my.txtの先頭に「C#/。NET」を追加しました(ローカルコミット)
*-<[RemoteRepo]>(複製元のリポジトリ)

RemoteRepoからチェックアウトした元のバージョンと比較した場合、my.txtanswers.txtに対するすべての変更の合計の違いをどのように表示できますか?

34
Ian Dallas

3つの方法があります(他の回答から2つがここに与えられます)

1) git diff Origin/master master
2) git diff Origin/master..master
3) git diff Origin/master...master

1つ目と2つ目は同じで、マスターとリモートマスターのヒント間の変更を示しています。

3つ目は、ブランチの最後のプッシュ以降にマスターで発生した変更を示しています。これは、あなたが探している最も適切なものだと思います

50
manojlds

最も簡単な答えは

 git show-branch

より細かく制御するためにできることは、git log別館git rev-listを使用することです。

 git log --left-right --graph --cherry-pick \
      --oneline branchname...remote/branchname

これは私の好みの方法であり、次のような結果になります

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 some tagged commit

--decorateを含めると、gitk、git-gui、gitwebに近いものが得られます。

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c (tag_4) Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 (tag_3) some tagged commit

PROヒント1:使いやすいように 'git config alias.lr log --long-option1 --long-option2'を使用してください

プロのヒント2:git config color.ui auto」を使用してすぐに目を覚ます

必要な場合allローカルヘッド(すべてのローカルブランチ)対allリモートコミット(同じブランチに):

git log --decorate --pretty=oneline --all --not --glob=refs/remotes --no-walk

すべての個別のリビジョンを取得するには、ウォークスルーをオフにします。この場合、前に示したスイッチを使用することを好みます(--graph --left-right)

マージ

マージを明確に表示する場合は、-boundaryを含めます

さまざまな高度なクエリ:

結果のフィルタリング

Git logおよびrev-listは、多数のfilteringなフィルタリング機能をサポートしています。manページを参照してください

--after '2001-01-01'
--until 'last week'
--author 'martin'
-E -i  --grep='fixes #[0123456789]+'
-S 'new_debug_function'

そして、他の多くの人。これにより、必要な情報をほぼゼロの労力で正確に取得するための十分なレバレッジが得られます。

ローカルに何が隠されていますか?

スタッシュには存在するがリモートにはないもの(リモートブランチ上のスタッシュを参照する方法はないことに注意してください。

git log $(git rev-list -g stash) --not --glob=refs/remotes 

すべての(その他の)到達不能コミット...

ノート

  • 私のワークフローでは、これらの構成はリベース/修正されたコミットとドロップされたスタッシュのみ
  • また、これらを生成するには、履歴グラフのサイズに応じて時間がかかります
  • これにはドロップされたスタッシュが含まれますが、現在のスタッシュは含まれません

    git log $(git fsck --unreachable --full --lost-found | grep 'commit' | cut -d '' -f3)\ --no-walk --not --glob = refs/remotes --oneline - 飾る

スクリプティング

スクリプトを作成するために、git logの使用をgit rev-listに置き換えると、ハッシュだけが得られます(さらに、いくつかのscript-prrofの堅牢性)。

[1]リポジトリ間でスタッシュを転送する方法に関する以前の回答も参照してください。

16
sehe

(通常)必要なことを行う最も簡単で確かに覚えやすいコマンドは次のとおりです。

git diff Origin

これは、最初にプルしたもの(Origin)と現在作業中のブランチ(デフォルトはmaster)の差分を示します。

8
jpatokal

違いはgit diff A Bで表示でき、AのコードとBのコードを比較します。

git diff Origin/master master

Origin/masterは、最後にフェッチ(またはクローン)したときのリモートマスターブランチの状態です。masterは、ローカルで作業しているときにブランチを切り替えた場合を除き、コードのローカル状態です。

5
knittl

すべてのgit diff HEAD Origin/"nameofyourbranch"

特定のファイルの場合git diff HEAD: "filename" Origin/"nameofbranch": "filename"

2
Wissam Youssef
git diff Origin/master..master
2
Brian Campbell