pengembangan-web-mp-pd.com

Pindahkan penunjuk cabang ke komit yang berbeda tanpa checkout

Untuk memindahkan pointer cabang dari cabang yang dicentang, seseorang dapat menggunakan perintah git reset --hard. Tetapi bagaimana cara memindahkan pointer cabang dari cabang yang tidak diperiksa untuk menunjuk komit yang berbeda (menjaga semua hal lain seperti cabang jarak jauh yang dilacak)?

612
Mot

N.B. Jika Anda hanya ingin memindahkan cabang ke komit lain, cara termudah adalah

git branch -f branch-name new-tip-commit

sebagaimana dirinci oleh jawaban Chris Johnsen .

Anda dapat melakukannya untuk referensi sewenang-wenang. Ini adalah cara memindahkan pointer cabang: 

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

Bentuk umum:

git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>

Anda dapat memilih nits tentang pesan reflog jika Anda mau - Saya percaya branch -f berbeda dengan reset --hard, dan ini bukan salah satu dari keduanya.

437
Adam A
git branch -f branch-name new-tip-commit
828
Chris Johnsen

Anda juga dapat memberikan referensi komit kepada git reset --hard.

Sebagai contoh:

git checkout branch-name
git reset --hard new-tip-commit

Saya menemukan saya melakukan sesuatu seperti ini secara semi-sering:

Dengan asumsi sejarah ini

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
122
Amiel Martin

Hanya untuk memperkaya diskusi, jika Anda ingin memindahkan cabang myBranch ke current commit Anda, cukup hapus argumen kedua setelah -f

Contoh:

git branch -f myBranch


Saya biasanya melakukan ini ketika saya rebase saat dalam keadaan Terpisah HEAD :)

29
Matheus Felipe

Dalam gitk --all:

  • klik kanan pada komit yang Anda inginkan
  • -> buat cabang baru
  • masukkan nama cabang yang ada
  • tekan kembali pada dialog yang mengonfirmasi mengganti cabang lama dari nama itu.

Hati-hati dengan menciptakan kembali alih-alih memodifikasi cabang yang ada akan kehilangan informasi cabang-pelacakan. (Ini umumnya bukan masalah untuk kasus penggunaan sederhana di mana hanya ada satu remote dan cabang lokal Anda memiliki nama yang sama dengan cabang terkait di remote. Lihat komentar untuk detail lebih lanjut, terima kasih @mbdevpl untuk menunjukkan downside ini.)

Akan keren jika gitk memiliki fitur di mana kotak dialog memiliki 3 opsi: menimpa, memodifikasi yang sudah ada, atau membatalkan.


Bahkan jika Anda biasanya pecandu baris perintah seperti saya, git gui dan gitk dirancang cukup baik untuk subset penggunaan git yang mereka izinkan. Saya sangat merekomendasikan menggunakannya untuk apa yang mereka kuasai (yaitu, secara selektif mementaskan bakhil ke dalam/keluar dari indeks di git gui, dan juga hanya melakukan komitmen. (Ctrl-s untuk menambahkan tanda-off: baris, ctrl-enter untuk melakukan .)

gitk sangat bagus untuk melacak beberapa cabang saat Anda menyortir perubahan Anda menjadi rangkaian tambalan yang bagus untuk dikirim ke hulu, atau apa pun di mana Anda perlu melacak apa yang Anda miliki di tengah-tengah dengan beberapa cabang.

Saya bahkan tidak memiliki browser file grafis terbuka, tetapi saya suka gitk/git gui.

11
Peter Cordes

Solusi yang disarankan git branch -f branch-pointer-to-move new-pointer in TortoiseGit :

  • "Git Tampilkan log"
  • Centang "Semua Cabang"
  • Pada baris yang Anda inginkan pointer cabang untuk pindah ke (pointer baru):
    • Klik kanan, "Buat Cabang di versi ini"
    • Di samping "Cabang", masukkan nama cabang yang akan dipindahkan (branch-pointer-to-move)
    • Di bawah "Base On", periksa apakah pointer baru sudah benar
    • Periksa "Paksa"
    • Ok

 enter image description here

 enter image description here

5
ax.

Jujur, saya terkejut bagaimana tidak ada yang berpikir tentang perintah git Push:

git Push -f . <destination>:<branch>

Titik (.) Merujuk ke repositori lokal, dan Anda mungkin memerlukan opsi -f karena tujuannya bisa "di belakang rekan jauh" .

Meskipun perintah ini digunakan untuk menyimpan perubahan Anda di server Anda, hasilnya persis sama seperti jika memindahkan cabang jarak jauh (<branch>) ke komit yang sama dengan cabang lokal (<destination>)