Pertanyaan Jadikan cabang Git saat ini sebagai cabang utama


Saya memiliki repositori di Git. Saya membuat cabang, kemudian melakukan beberapa perubahan baik ke master dan ke cabang.

Kemudian, puluhan komit kemudian, saya menyadari cabang berada dalam keadaan yang jauh lebih baik daripada tuannya, jadi saya ingin cabang itu "menjadi" tuan dan mengabaikan perubahan pada tuannya.

Saya tidak bisa menggabungkannya, karena saya tidak ingin menyimpan perubahan pada master. Apa yang harus saya lakukan?

Tambahan: Dalam hal ini, master 'lama' sudah ada push-sedang ke repositori lain seperti GitHub. Bagaimana ini mengubah hal-hal?


1310
2018-05-04 05:30


asal


Jawaban:


Masalah dengan dua jawaban lainnya adalah bahwa tuan baru tidak memiliki tuan tua sebagai leluhur, jadi ketika Anda mendorongnya, orang lain akan menjadi kacau. Ini yang ingin Anda lakukan:

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

Jika Anda ingin sejarah Anda menjadi sedikit lebih jelas, saya akan merekomendasikan menambahkan beberapa informasi ke pesan komit gabungan untuk membuatnya jelas apa yang telah Anda lakukan. Ubah baris kedua menjadi:

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

1743
2018-05-04 06:00



Pastikan semuanya didorong ke repositori jarak jauh Anda (GitHub):

git checkout master

Timpa "master" dengan "better_branch":

git reset --hard better_branch

Memaksa push ke repositori jarak jauh Anda:

git push -f origin master

168
2018-06-24 20:25



Edit: Anda tidak mengatakan Anda telah mendorong ke repo publik! Itu membuat perbedaan dunia.

Ada dua cara, cara "kotor" dan cara "bersih". Misalkan cabang Anda bernama new-master. Ini adalah cara yang bersih:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

Ini akan membuat file konfigurasi berubah agar cocok dengan cabang yang berganti nama.

Anda juga dapat melakukannya dengan cara kotor, yang tidak akan memperbarui file konfigurasi. Ini adalah apa yang terjadi di bawah kap di atas ...

mv -i .git/refs/new-master .git/refs/master
git checkout master

65
2018-05-04 05:37



Ganti nama cabang menjadi master oleh:

git branch -M branch_name master

39
2018-05-04 05:37



Solusi yang diberikan di sini (mengganti nama cabang di 'master') tidak menuntut konsekuensi untuk reparasi jarak jauh (GitHub):

    -f
    --memaksa

Biasanya, perintah menolak untuk memperbarui remote ref yang bukan merupakan leluhur dari ref lokal yang digunakan untuk menimpanya. Bendera ini menonaktifkan pemeriksaan. Ini dapat menyebabkan repositori jarak jauh kehilangan komit; gunakan dengan hati-hati.

Jika orang lain telah menarik repo Anda, mereka tidak akan dapat menarik sejarah master baru tanpa mengganti master mereka sendiri dengan cabang master GitHub baru (atau berurusan dengan banyak penggabungan).
Ada alternatif untuk git push - force untuk repos publik.
Jawaban Jefromi (menggabungkan perubahan yang benar kembali ke master asli) adalah salah satunya.


11
2018-05-04 05:57



Dari apa yang saya pahami, Anda dapat mencabangkan cabang saat ini ke dalam cabang yang ada. Intinya, ini akan overwrite master dengan apa pun yang Anda miliki di cabang saat ini:

git branch -f master HEAD

Setelah Anda selesai melakukannya, Anda biasanya dapat mendorong lokal Anda master cabang, mungkin membutuhkan memaksa parameter di sini juga:

git push -f origin master

Tidak ada penggabungan, tidak ada perintah panjang. Secara sederhana branch dan push- tapi ya, ini akan menulis ulang sejarah dari master cabang, jadi jika Anda bekerja dalam tim, Anda harus tahu apa yang Anda lakukan.




Sebagai alternatif, saya menemukan bahwa Anda dapat mendorong cabang apa pun ke cabang terpencil mana saja, jadi:

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

10
2018-04-04 22:44



Anda juga dapat memeriksa semua file dari cabang lain ke dalam master:

git checkout master
git checkout better_branch -- .

dan kemudian melakukan semua perubahan.


6
2018-03-04 17:51



Saya menemukan metode sederhana ini untuk bekerja yang terbaik. Itu tidak menulis ulang sejarah dan semua check-in sebelumnya dari cabang akan ditambahkan ke master. Tidak ada yang hilang, dan Anda dapat dengan jelas melihat apa yang terjadi dalam log commit.

Tujuan: Menjadikan kondisi "cabang" saat ini "master"

Bekerja di cabang, berkomitmen dan mendorong perubahan Anda untuk memastikan repositori lokal dan jauh Anda up to date:

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

Setelah ini, master Anda akan menjadi status pasti dari commit of branch terakhir Anda dan master commit log Anda akan menampilkan semua check-in dari cabang.


5
2018-04-08 15:30