Pertanyaan Bandingkan versi lama dan baru permintaan tarik paksa


Sering, kolega saya akan membuat beberapa perubahan pada permintaan penarikan terbuka, mencabut cabang lokal mereka terhadap cabang dasar - sering kali meremas perubahan mereka ke dalam komitmen sebelumnya - dan mendorong kekuatan.

Bagaimana saya bisa melihat apa yang berubah antara versi lama PR dan versi baru PR?

Saya kira saya bisa melakukan git pull dan git checkout $BRANCH_NAME ketika PR pertama kali diangkat, lalu git fetch lalu git diff $BRANCH_NAME..origin/$BRANCH_NAME setelah PR diperbarui - tetapi itu juga akan menunjukkan perubahan yang telah diperkenalkan ke cabang dasar (biasanya master) dan dibawa ke PR melalui rebase. Apakah mungkin untuk menghilangkan kebisingan itu dan hanya menunjukkan apa yang telah berubah dalam PR itu sendiri?


16
2017-09-25 08:13


asal


Jawaban:


Periksa ini jawablah pertanyaan lain yang ingin melakukan sesuatu yang sangat mirip dengan apa yang Anda coba capai.

Ini menggambarkan situasi Anda seperti ini:

newcommit -> the new pull request commit
oldcommit -> the old pull request commit
upstream -> the base branch commit the new pull request is based on

Sekarang lakukan ini:

git commit-tree newcommit^{tree} -p oldcommit -p upstream -m "message"
git show <commit id returned by previous command>

Idenya adalah bahwa komit-pohon akan memalsukan penggabungan antara oldcommit dan upstream memproduksi newcommit pohon dan dengan demikian mengandung persis kode newcommit. Itu tidak mengubah cabang Anda saat ini sama sekali, itu membuat komit tanpa kepala baru dan memberi Anda ID-nya. Ini berarti git show akan mendaftar setiap modifikasi sebagai resolusi konflik, yang merupakan perbedaan pasti antara PR baru dan yang lama.

Untuk dapat melakukan itu Anda harus memiliki PR sebelumnya di repositori git Anda di suatu tempat (jika force push telah dilakukan, sejarah git telah ditulis ulang dan tidak dapat dipulihkan kecuali Anda memilikinya di pc Anda atau Anda memiliki akses ke server reflog). Memeriksa VonC jawab untuk detail tentang ini.

Asumsi:

  • cabang dasar: master
  • Anda memiliki cabang PR lokal yang lama: $BRANCH_NAME
  • PR baru di cabang terpencil: origin/$BRANCH_NAME

Anda dapat melakukan seperti ini:

# fetch locally upstream changes (origin/$BRANCH_NAME)
git fetch
# produce the fake merge commit
git commit-tree origin/$BRANCH_NAME^{tree} \
         -p $BRANCH_NAME \
         -p `git merge-base master origin/$BRANCH_NAME` \
         -m "message"
# see "fake" conflict resolution = difference between the two PR
git show <commit id returned by previous command>

itu git merge-base digunakan untuk menemukan leluhur bersama antara dua cabang, dalam hal ini untuk menemukan komit di mana PR baru didasarkan pada cabang dasar, jika Anda lebih suka Anda dapat menulis ID komit secara langsung.


7
2017-11-10 11:40



versi lama PR

Itu hanya akan tersedia di reflog dari repo jarak jauh, yang akan mencakup KEPALA sebelumnya dari cabang yang didorong paksa.
Karena repo jarak jauh adalah GitHub, Anda masih dapat menyimpulkan commit lama dengan melihat peristiwa push: lihat "Apakah github ingat melakukan ID?".

topi juga akan menunjukkan perubahan yang telah diperkenalkan ke cabang dasar (biasanya master)

Lebih tepatnya, Anda akan selalu memiliki perbedaan dengan leluhur yang sama (yang akan mencakup komitmen dari cabang dasar seperti master)

Lihat Apa perbedaan antara titik-ganda ".."dan triple-dot"..."dalam rentang komit diff Git?

http://mythic-beasts.com/~mark/git-diff-help.png

Jadi dalam kasus Anda, cabang yang didorong paksa terlihat seperti ini pada repo jarak jauh:

      x--x--x        (old branch in reflog)
     /
 m--M0--M--M   (master)
            \
             X--X--X (new branch forced push)

Sebuah old_HEAD tua. NewHEAD akan mencakup beberapa M melakukan dari cabang dasar, karena mereka adalah bagian dari leluhur bersama (M0) jalan.

Jadi Anda dapat membandingkan cabang yang didorong paksa (memberikan Anda memantau pushEvents dan mengetahui HEAD sebelumnya dari cabang tersebut).
Tetapi Anda tidak dapat dengan mudah membandingkan dua cabang tanpa jalur leluhur bersama mereka.


6
2017-11-04 00:18