git depan / belakang info antara master dan branch?

201

Saya telah membuat cabang untuk pengujian di repo lokal saya ( test-branch) yang saya dorong Github.

Jika saya pergi ke Githubakun saya dan pilih ini test-branchitu menunjukkan info:

This branch is 1 commit ahead and 2 commits behind master

Pertanyaan saya adalah:

  1. Bagaimana saya bisa menampilkan info ini secara lokal (yaitu: perintah yang menunjukkan ini di terminal, daripada harus terbuka Githubuntuk melihatnya)?
  2. Saya tahu saya bisa melihat perbedaan antar cabang menggunakan:

    git diff master..test-branch
    

    atau menggunakan Meld(yang saya suka):

    git difftool master..test-branch
    

    tapi saya bertanya-tanya apakah ada cara untuk melihat bagian depan dan belakang melakukan secara terpisah. IE: adakah cara untuk menunjukkan bahwa saya berkomitmen untuk maju dengan sendirinya dan kemudian kedua komitmen tersebut melakukannya sendiri?

Gabriel
sumber
1
Git 2.5+ (Q2 2015) akan diperkenalkan git for-each-ref --format="%(push:track)" refs/heads. Lihat jawaban saya di bawah ini
VonC
1
Karena saya tidak dapat menemukan pertanyaan ini menggunakan kata kunci yang akan saya tulis, saya hanya ingin mencatat bahwa ini sama dengan mengambil pelengkap relatif (atau "setel perbedaan") antara set komit yang membentuk cabang-cabang tersebut (dan kemudian menghitung elemen). Semoga ini membuatnya menjadi indeks mesin pencari.
PMOS

Jawaban:

309

Berikut adalah trik yang saya temukan untuk membandingkan dua cabang dan menunjukkan berapa banyak yang dilakukan setiap cabang di depan yang lain (jawaban yang lebih umum pada pertanyaan Anda 1):

Untuk cabang lokal : git rev-list --left-right --count master...test-branch

Untuk jarak jauh cabang : git rev-list --left-right --count origin/master...origin/test-branch

Ini menghasilkan output seperti berikut:

1 7

Output ini berarti: "Dibandingkan dengan master,test-branch ada 7 komitmen di depan dan 1 komit di belakang."

Anda juga dapat membandingkan cabang lokal dengan cabang jarak jauh, mis. origin/master...masterUntuk mengetahui berapa banyak komit yang dilakukan mastercabang lokal di depan / di belakang rekan jauhnya.

pengguna1834095
sumber
1
Ini adalah solusi yang bagus bagi saya untuk mencari tahu apakah saya dapat menghapus cabang atau jika masih maju.
Maverick1st
1
@ Maverick1st, ya, perintah ini sangat berguna ketika Anda mengikuti alur kerja gitflow (yang saya)
user1834095
2
Ini adalah yang terbaik untuk kasus penggunaan saya menemukan jika cabang fitur Anda saat ini berada di belakang remote master ( git rev-list --left-right --count origin/master...@) - asalkan pengguna melakukannya git fetchsebelumnya; berguna untuk mencegah penarikan permintaan dari cabang yang sudah ketinggalan zaman.
jakub.g
9
Untuk memeriksa berapa banyak komit di belakang adalah cabang saat ini:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g
8
@ jakub.g Anda tidak perlu memotong jika Anda menggunakan --left-onlyatau--right-only
jasonkarns
39

Pertama-tama untuk melihat berapa banyak revisi di belakang Anda secara lokal, Anda harus melakukan a git fetchuntuk memastikan Anda memiliki info terbaru dari remote Anda.

Output default git statusmemberitahu Anda berapa banyak revisi Anda di depan atau di belakang, tetapi biasanya saya menemukan ini terlalu bertele-tele:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Saya lebih suka git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

Sebenarnya saya alias ini secara sederhana git s, dan ini adalah perintah utama yang saya gunakan untuk memeriksa status.

Untuk melihat perbedaan dalam "revisi depan" master, saya dapat mengecualikan "di belakang revisi" dari origin/master:

git diff master..origin/master^

Untuk melihat perbedaan dalam "revisi belakang" dari origin/master, saya dapat mengecualikan "revisi depan" dari master:

git diff origin/master..master^^

Jika ada 5 revisi di depan atau di belakang mungkin lebih mudah untuk menulis seperti ini:

git diff master..origin/master~5
git diff origin/master..master~5

MEMPERBARUI

Untuk melihat revisi di depan / belakang, cabang harus dikonfigurasi untuk melacak cabang lain. Bagi saya ini adalah perilaku default ketika saya mengkloning repositori jarak jauh, dan setelah saya mendorong cabang dengangit push -u remotename branchname . Versi saya adalah 1.8.4.3, tetapi sudah berfungsi seperti ini selama saya ingat.

Pada versi 1.8, Anda dapat mengatur cabang pelacakan seperti ini:

git branch --track test-branch

Pada versi 1.7, sintaksnya berbeda:

git branch --set-upstream test-branch
janos
sumber
Versi apa gityang Anda gunakan? Saya tidak bisa mereproduksi apa yang Anda dapatkan dengan git statusatau dengan git status -sb. Jika saya mencoba salah satu perintah (setelah melakukan git fetch) saya tidak mendapatkan info tentang komit di depan / belakang.
Gabriel
8
Cara Anda untuk melihat komit di depan dan di belakang diterapkan ke masterdan origin/masterdan saya ingin melihat masterperbedaan itu untuk dan cabang lain test-branch. Bisakah Anda memformat ulang jawaban Anda untuk mengatasi masalah ini?
Gabriel
Perbedaan "belakang" dan "depan" hanya berfungsi untuk saya jika saya menggunakan 3 titik di antara nama-nama cabang (bukan 2). Dan ^ dan ^^ tampaknya tidak masalah di sini. Misalnya: git diff master ... origin / master git diff asal / master ... master Anyways, "git status -sb" sangat membantu.
Vituel
10

Dengan Git 2.5+, Anda sekarang memiliki opsi lain untuk melihat ke depan / belakang untuk semua cabang yang dikonfigurasi untuk mendorong ke cabang.

git for-each-ref --format="%(push:track)" refs/heads

Lihat lebih lanjut di " Melihat Komit Git yang Tidak Dicabut "

VONC
sumber
Bisakah Anda melakukan ini hanya untuk cabang saat ini dan cabang pelacakan jarak jauh?
spex
@spex ya: lengkap refs/headsdengan nama cabang saat ini ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC
3

Anda juga dapat menggunakannya awkuntuk membuatnya sedikit lebih cantik:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Anda bahkan dapat membuat alias yang selalu mengambil asal terlebih dahulu lalu membandingkan cabang

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
Antonis
sumber
1

Setelah melakukan git fetch, Anda dapat menjalankan status git untuk menunjukkan berapa banyak komit yang dilakukan cabang lokal di depan atau di belakang versi remote dari cabang.

Ini tidak akan menunjukkan berapa banyak yang melakukan itu di depan atau di belakang cabang yang berbeda. Opsi Anda adalah diff penuh, melihat github, atau menggunakan solusi seperti Vimhsa yang ditautkan di atas: Git status atas semua repo

Wade Williams
sumber