Pindahkan komit terbaru ke cabang baru dengan Git

4986

Saya ingin memindahkan beberapa komit terakhir yang telah saya komit untuk dikuasai ke cabang baru dan membawa master kembali sebelum komit dibuat. Sayangnya, Git-fu saya belum cukup kuat, ada bantuan?

Yaitu Bagaimana saya bisa pergi dari ini

master A - B - C - D - E

untuk ini?

newbranch     C - D - E
             /
master A - B 
Mark A. Nicolosi
sumber
114
Catatan: Saya ditanya pertanyaan berlawanan di sini
Benjol
3
eddmann.com/posts/… yang ini berfungsi
Sagar Naliyapara
7
Apakah komentar di sini dibersihkan? Saya bertanya karena selama kunjungan dua bulanan ke pertanyaan ini, saya selalu menggulirkan komentar itu.
Tejas Kale

Jawaban:

6453

Pindah ke cabang yang ada

Jika Anda ingin memindahkan komit Anda ke cabang yang ada , itu akan terlihat seperti ini:

git checkout existingbranch
git merge master         # Bring the commits here
git checkout master
git reset --keep HEAD~3  # Move master back by 3 commits.
git checkout existingbranch

The --keeppilihan mempertahankan perubahan uncommitted yang mungkin Anda miliki di file yang tidak terkait, atau dibatalkan jika perubahan tersebut akan menjadi ditimpa - mirip dengan apa yang git checkoutdilakukannya. Jika gagal, git stashperubahan dan coba lagi, atau gunakan --harduntuk kehilangan perubahan (bahkan dari file yang tidak berubah di antara komitmen!)

Pindah ke cabang baru

Metode ini berfungsi dengan membuat cabang baru dengan perintah pertama ( git branch newbranch) tetapi tidak beralih ke sana. Kemudian kami memutar kembali cabang saat ini (master) dan beralih ke cabang baru untuk terus bekerja.

git branch newbranch      # Create a new branch, containing all current commits
git reset --keep HEAD~3   # Move master back by 3 commits (Make sure you know how many commits you need to go back)
git checkout newbranch    # Go to the new branch that still has the desired commits
# Warning: after this it's not safe to do a rebase in newbranch without extra care.

Tetapi pastikan berapa banyak yang berkomitmen untuk kembali. Atau, alih-alih HEAD~3, Anda cukup memberikan hash dari commit (atau referensi seperti origin/master) yang ingin Anda kembalikan, misalnya:

git reset --keep a1b2c3d4

PERINGATAN: Dengan Git versi 2.0 dan yang lebih baru, jika nanti Anda git rebasecabang baru pada cabang asli ( master), Anda mungkin memerlukan --no-fork-pointopsi eksplisit selama rebase untuk menghindari kehilangan komit yang Anda pindahkan dari cabang master. Memiliki branch.autosetuprebase alwaysset membuat ini lebih mungkin. Lihat jawaban John Mellor untuk detailnya.

Duc Filan
sumber
249
Dan khususnya, jangan mencoba untuk kembali lebih jauh dari titik di mana Anda terakhir kali mendorong komit ke repositori lain tempat orang lain mungkin menarik.
Greg Hewgill
107
Ingin tahu jika Anda dapat menjelaskan MENGAPA ini bekerja. Bagi saya Anda sedang membuat cabang baru, menghapus 3 komit dari cabang lama Anda masih di, dan kemudian memeriksa cabang yang Anda buat. Jadi, bagaimana komit yang Anda hapus secara ajaib muncul di cabang baru?
Jonathan Dumaine
142
@ Jonathan Dumaine: Karena saya membuat cabang baru sebelum menghapus komit dari cabang lama. Mereka masih ada di cabang baru.
sykora
86
cabang di git hanyalah penanda yang menunjukkan komitmen dalam sejarah, tidak ada yang dikloning, dibuat atau dihapus (kecuali penanda)
knittl
218
Perhatikan juga: Jangan lakukan ini dengan perubahan yang tidak dikomit di copy pekerjaan Anda! Ini hanya menggigitku! :(
Adam Tuttle
1039

Bagi mereka yang bertanya-tanya mengapa ini bekerja (seperti saya pada awalnya):

Anda ingin kembali ke C, dan memindahkan D dan E ke cabang baru. Begini tampilannya pada awalnya:

A-B-C-D-E (HEAD)
        ↑
      master

Setelah git branch newBranch:

    newBranch
        ↓
A-B-C-D-E (HEAD)
        ↑
      master

Setelah git reset --hard HEAD~2:

    newBranch
        ↓
A-B-C-D-E (HEAD)
    ↑
  master

Karena cabang hanyalah sebuah pointer, master menunjuk ke komit terakhir. Saat Anda membuat newBranch , Anda cukup membuat pointer baru ke komit terakhir. Kemudian gunakan git resetAnda memindahkan pointer master kembali dua komit. Tetapi karena Anda tidak memindahkan newBranch , itu masih menunjuk ke komit yang awalnya.

Ryan Lundy
sumber
56
Saya juga perlu melakukan git push origin master --forceagar perubahan muncul di repositori utama.
Dženan
9
Jawaban ini menyebabkan komit hilang: lain kali Anda git rebase, 3 komit tersebut akan dibuang secara diam-diam newbranch. Lihat jawaban saya untuk detail dan alternatif yang lebih aman.
John Mellor
14
@ John, itu omong kosong. Rebasing tanpa mengetahui apa yang Anda lakukan menyebabkan kehilangan. Jika Anda kehilangan komitmen, saya minta maaf untuk Anda, tetapi jawaban ini tidak kehilangan komitmen Anda. Catatan yang origin/mastertidak muncul dalam diagram di atas. Jika Anda mendorong ke origin/masterdan kemudian membuat perubahan di atas, tentu saja, semuanya akan menjadi lucu. Tapi itu masalah "Dokter, sakit kalau aku melakukan ini". Dan itu di luar ruang lingkup untuk apa pertanyaan awal diajukan. Saya sarankan Anda menulis pertanyaan Anda sendiri untuk menjelajahi skenario Anda alih-alih membajak yang ini.
Ryan Lundy
1
@ John, dalam jawaban Anda, Anda berkata "Jangan lakukan ini! git branch -t newbranch". Kembali dan baca jawabannya lagi. Tidak ada yang menyarankan melakukan itu.
Ryan Lundy
1
@ Kirralessa, tentu, tetapi jika Anda melihat diagram dalam pertanyaan, jelas bahwa mereka ingin newbranchdidasarkan pada mastercabang lokal mereka yang ada . Setelah melakukan jawaban yang diterima, ketika pengguna mendapatkan sekitar untuk berjalan git rebasedi newbranch, git akan mengingatkan mereka bahwa mereka lupa untuk mengatur cabang hulu, sehingga mereka akan menjalankan git branch --set-upstream-to=masterkemudian git rebasedan memiliki masalah yang sama. Mereka mungkin juga digunakan git branch -t newbranchdi tempat pertama.
John Mellor
455

Secara umum...

Metode yang diekspos oleh sykora adalah pilihan terbaik dalam kasus ini. Tetapi kadang-kadang bukan yang termudah dan itu bukan metode umum. Untuk metode umum, gunakan git cherry-pick :

Untuk mencapai apa yang diinginkan OP, ini adalah proses 2 langkah:

Langkah 1 - Catat komit mana yang Anda inginkan pada a newbranch

Menjalankan

git checkout master
git log

Perhatikan hash dari (katakanlah 3) komit yang Anda inginkan newbranch. Di sini saya akan menggunakan:
C commit: 9aa1233
D commit: 453ac3d
E commit:612ecb3

Catatan: Anda dapat menggunakan tujuh karakter pertama atau seluruh hash

Langkah 2 - Tempatkan mereka di newbranch

git checkout newbranch
git cherry-pick 612ecb3
git cherry-pick 453ac3d
git cherry-pick 9aa1233

ATAU (pada Git 1.7.2+, gunakan rentang)

git checkout newbranch
git cherry-pick 612ecb3~1..9aa1233

git cherry-pick menerapkan ketiga komitmen pada cabang baru.

Ivan
sumber
13
Bukankah OP mencoba untuk pindah dari master ke cabang baru? Jika Anda memilih cherry saat menjadi master, Anda akan menambahkan ke cabang master - menambahkan komitmen yang sudah dimilikinya, pada kenyataannya. Dan itu tidak bergerak kembali baik kepala cabang ke B. Atau apakah ada sesuatu yang halus dan keren yang tidak saya dapatkan?
RaveTheTadpole
6
Ini bekerja sangat baik jika Anda secara tidak sengaja melakukan salah, cabang non-master, ketika Anda harus membuat cabang fitur baru.
julianc
5
+1 untuk pendekatan yang bermanfaat dalam beberapa situasi. Ini bagus jika Anda hanya ingin menarik komit Anda sendiri (yang diselingi dengan yang lain) ke cabang baru.
Tyler V.
8
Itu jawaban yang lebih baik. Dengan cara ini Anda dapat memindahkan komit ke cabang mana pun.
Pencakar langit
8
Apakah urutan memetik ceri penting?
kon psych
328

Namun cara lain untuk melakukan ini, hanya menggunakan 2 perintah. Juga menjaga pohon kerja Anda saat ini utuh.

git checkout -b newbranch # switch to a new branch
git branch -f master HEAD~3 # make master point to some older commit

Versi lama - sebelum saya pelajarigit branch -f

git checkout -b newbranch # switch to a new branch
git push . +HEAD~3:master # make master point to some older commit 

Mampu pushmelakukannya .adalah trik yang bagus untuk diketahui.

aragaer
sumber
1
Direktori saat ini. Saya kira ini hanya akan berfungsi jika Anda berada di direktori teratas.
aragaer
1
Dorongan lokal mendorong-senyum, tetapi pada refleksi, bagaimana perbedaannya di git branch -fsini?
jthill
2
@ GerardSexton .adalah direktur saat ini. git dapat mendorong ke URL REMOTES atau GIT. path to local directorydidukung sintaks URL Git. Lihat bagian GIT URL di git help clone.
lemah
31
Saya tidak tahu mengapa ini tidak diberi peringkat lebih tinggi. Mati sederhana, dan tanpa bahaya kecil tapi potensial dari git reset --hard.
Godsmith
4
@ Godsmith Dugaan saya adalah orang lebih suka tiga perintah sederhana daripada dua perintah yang sedikit lebih tidak jelas. Selain itu, jawaban pilihan teratas mendapatkan lebih banyak suara karena ditampilkan pertama kali.
JS_Riddler
323

Sebagian besar jawaban sebelumnya salah!

Jangan lakukan ini:

git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch

Saat lain kali Anda menjalankan git rebase(atau git pull --rebase) 3 komit itu akan dibuang secara diam-diam newbranch! (lihat penjelasan di bawah)

Alih-alih lakukan ini:

git reset --keep HEAD~3
git checkout -t -b newbranch
git cherry-pick ..HEAD@{2}
  • Pertama, membuang 3 komit terbaru ( --keepseperti --hard, tapi lebih aman, karena gagal daripada membuang perubahan yang tidak dikomit).
  • Lalu itu memotong newbranch.
  • Kemudian dia memilih 3 komit itu kembali newbranch. Karena mereka tidak lagi direferensikan oleh cabang, ia melakukannya dengan menggunakan reflog git : HEAD@{2}adalah komit yang HEADdigunakan untuk merujuk ke 2 operasi yang lalu, yaitu sebelum kita 1. memeriksa newbranchdan 2. digunakangit reset untuk membuang 3 commit.

Peringatan: reflog diaktifkan secara default, tetapi jika Anda telah menonaktifkannya secara manual (misalnya dengan menggunakan repositori git "bare"), Anda tidak akan bisa mendapatkan 3 komit kembali setelah menjalankan git reset --keep HEAD~3 .

Alternatif yang tidak bergantung pada reflog adalah:

# newbranch will omit the 3 most recent commits.
git checkout -b newbranch HEAD~3
git branch --set-upstream-to=oldbranch
# Cherry-picks the extra commits from oldbranch.
git cherry-pick ..oldbranch
# Discards the 3 most recent commits from oldbranch.
git branch --force oldbranch oldbranch~3

(jika Anda mau, Anda bisa menulis @{-1} - cabang yang sebelumnya diperiksa - bukan oldbranch).


Penjelasan teknis

Mengapa git rebasemembuang 3 komit setelah contoh pertama? Ini karenagit rebase tanpa argumen memungkinkan --fork-pointopsi secara default, yang menggunakan reflog lokal untuk mencoba menjadi kuat terhadap cabang hulu yang didorong paksa.

Misalkan Anda bercabang asal / master ketika berisi komit M1, M2, M3, lalu buat tiga komit sendiri:

M1--M2--M3  <-- origin/master
         \
          T1--T2--T3  <-- topic

tapi kemudian seseorang menulis ulang sejarah dengan memaksa asal / master untuk menghapus M2:

M1--M3'  <-- origin/master
 \
  M2--M3--T1--T2--T3  <-- topic

Dengan menggunakan reflog lokal Anda, git rebasedapat melihat bahwa Anda melakukan forked dari inkarnasi awal dari cabang asal / master, dan karenanya M2 dan M3 commit tidak benar-benar bagian dari cabang topik Anda. Oleh karena itu cukup beralasan bahwa sejak M2 telah dihapus dari cabang hulu, Anda tidak lagi menginginkannya di cabang topik Anda begitu cabang cabang dimundurkan:

M1--M3'  <-- origin/master
     \
      T1'--T2'--T3'  <-- topic (rebased)

Perilaku ini masuk akal, dan umumnya hal yang benar untuk dilakukan ketika rebasing.

Jadi alasan mengapa perintah berikut gagal:

git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch

karena mereka meninggalkan reflog dalam kondisi yang salah. Git melihat newbranchtelah memotong cabang upstream pada revisi yang menyertakan 3 commit, lalu reset --hardmenulis ulang sejarah upstream untuk menghapus commit, dan lain kali Anda menjalankannya git rebasemembuangnya seperti halnya komit lain yang telah dihapus dari upstream.

Tetapi dalam kasus khusus ini kami ingin 3 komitmen tersebut dianggap sebagai bagian dari cabang topik. Untuk mencapai itu, kita perlu memotong upstream pada revisi sebelumnya yang tidak termasuk 3 komitmen. Itulah yang dilakukan solusi yang saya sarankan, karena itu keduanya meninggalkan reflog dalam kondisi yang benar.

Untuk lebih jelasnya, lihat definisi --fork-pointdi git rebase dan git merge-base docs.

John Mellor
sumber
15
Jawaban ini mengatakan "JANGAN lakukan ini!" di atas sesuatu yang tidak ada yang menyarankan lakukan.
Ryan Lundy
4
Kebanyakan orang tidak menulis ulang sejarah yang dipublikasikan, terutama pada master. Jadi tidak, mereka tidak salah secara berbahaya.
Walf
4
@ Kirralessa, yang -tAnda maksud adalah git branchterjadi secara implisit jika Anda telah git config --global branch.autosetuprebase alwaysmengatur. Bahkan jika Anda tidak melakukannya, saya sudah menjelaskan kepada Anda bahwa masalah yang sama terjadi jika Anda mengatur pelacakan setelah melakukan perintah-perintah ini, karena OP kemungkinan bermaksud untuk memberikan pertanyaan mereka.
John Mellor
2
@RockLee, ya, secara umum cara untuk memperbaiki situasi tersebut adalah dengan membuat cabang baru (newbranch2) dari titik awal yang aman kemudian memilih semua komitmen yang ingin Anda pertahankan (dari badnewbranch ke newbranch2). Cherry-picking akan memberikan komit hash baru, sehingga Anda dapat dengan aman rebase newbranch2 (dan sekarang dapat menghapus badnewbranch).
John Mellor
2
@Walf, Anda salah paham: git rebase dirancang agar kuat terhadap upstreams yang riwayatnya ditulis ulang. Sayangnya, efek samping dari ketahanan itu memengaruhi setiap orang, bahkan jika mereka maupun hulu mereka tidak pernah menulis ulang sejarah.
John Mellor
150

Solusi yang jauh lebih sederhana dengan menggunakan git stash

Inilah solusi yang jauh lebih sederhana untuk komitmen ke cabang yang salah. Mulai dari cabang masteryang memiliki tiga kesalahan komitmen:

git reset HEAD~3
git stash
git checkout newbranch
git stash pop

Kapan harus menggunakan ini?

  • Jika tujuan utama Anda adalah untuk mundur master
  • Anda ingin menyimpan perubahan file
  • Anda tidak peduli dengan pesan yang dilakukan dengan kesalahan
  • Anda belum mendorong
  • Anda ingin ini mudah diingat
  • Anda tidak ingin komplikasi seperti cabang sementara / baru, menemukan dan menyalin hash komit, dan sakit kepala lainnya

Apa ini, dengan nomor baris

  1. Membatalkan tiga komitmen terakhir (dan pesannya) master, namun membiarkan semua file yang bekerja tetap utuh
  2. Menyimpan semua perubahan file yang sedang bekerja, membuat masterpohon yang bekerja sama persis dengan status HEAD ~ 3
  3. Beralih ke cabang yang ada newbranch
  4. Terapkan perubahan simpanan ke direktori kerja Anda dan hapus simpanan

Anda sekarang dapat menggunakan git adddan git commitseperti biasa. Semua komit baru akan ditambahkan kenewbranch .

Apa yang tidak dilakukan ini?

  • Itu tidak meninggalkan cabang sementara acak mengacaukan pohon Anda
  • Itu tidak menyimpan pesan komit yang salah, jadi Anda perlu menambahkan pesan komit baru ke komit baru ini
  • Memperbarui! Gunakan panah atas untuk menelusuri buffer perintah Anda untuk menerapkan kembali komit sebelumnya dengan pesan komitnya (terima kasih @ARK)

Tujuan

OP menyatakan tujuannya adalah untuk "mengambil alih kembali sebelum komitmen itu dibuat" tanpa kehilangan perubahan dan solusi ini melakukan itu.

Saya melakukan ini setidaknya seminggu sekali ketika saya secara tidak sengaja membuat komitmen baru mastersebagai gantinya develop. Biasanya saya hanya memiliki satu komit untuk rollback dalam hal ini menggunakan git reset HEAD^jalur 1 adalah cara yang lebih sederhana untuk mengembalikan hanya satu komit.

Jangan lakukan ini jika Anda mendorong perubahan master ke atas

Orang lain mungkin telah menarik perubahan itu. Jika Anda hanya menulis ulang master lokal Anda, tidak ada dampak ketika didorong ke hulu, tetapi mendorong sejarah yang ditulis ulang ke kolaborator dapat menyebabkan sakit kepala.

membanting
sumber
4
Terima kasih, saya sangat senang saya membaca melewati / melalui begitu banyak untuk sampai ke sini, karena itu adalah kasus penggunaan yang cukup umum bagi saya juga. Apakah kita begitu tidak khas?
Jim Mack
6
Saya pikir kita benar-benar tipikal dan "oops saya berkomitmen untuk menguasai secara tidak sengaja" adalah kasus penggunaan yang paling umum untuk kebutuhan untuk mengembalikan beberapa komitmen. Beruntung solusi ini sangat sederhana sehingga saya hafal sekarang.
Slam
9
Ini harus menjadi jawaban yang diterima. Mudah, mudah dipahami, dan mudah diingat
Sina Madani
1
Saya tidak berpikir acara menyembunyikan itu perlu. Saya hanya melakukannya tanpa dan bekerja dengan baik.
A Campos
1
Anda juga dapat dengan mudah mendapatkan pesan komit kembali, jika Anda memilikinya di riwayat CLI (command line) Anda. Saya kebetulan memiliki kedua git adddan git commitperintah yang saya gunakan sehingga yang harus saya lakukan adalah menekan panah dan memasukkan beberapa kali dan boom! Semuanya kembali, tetapi di cabang kanan sekarang.
Luke Gedeon
30

Ini tidak "memindahkan" mereka dalam arti teknis tetapi memiliki efek yang sama:

A--B--C  (branch-foo)
 \    ^-- I wanted them here!
  \
   D--E--F--G  (branch-bar)
      ^--^--^-- Opps wrong branch!

While on branch-bar:
$ git reset --hard D # remember the SHAs for E, F, G (or E and G for a range)

A--B--C  (branch-foo)
 \
  \
   D-(E--F--G) detached
   ^-- (branch-bar)

Switch to branch-foo
$ git cherry-pick E..G

A--B--C--E'--F'--G' (branch-foo)
 \   E--F--G detached (This can be ignored)
  \ /
   D--H--I (branch-bar)

Now you won't need to worry about the detached branch because it is basically
like they are in the trash can waiting for the day it gets garbage collected.
Eventually some time in the far future it will look like:

A--B--C--E'--F'--G'--L--M--N--... (branch-foo)
 \
  \
   D--H--I--J--K--.... (branch-bar)
Sukima
sumber
1
Tidak bisakah kamu menggunakan rebaseuntuk hal yang sama?
Bergi
Ya, Anda dapat menggunakan alternatif rebasepada cabang terpisah dalam skenario di atas.
Sukima
24

Untuk melakukan ini tanpa menulis ulang riwayat (yaitu jika Anda sudah mendorong komit):

git checkout master
git revert <commitID(s)>
git checkout -b new-branch
git cherry-pick <commitID(s)>

Kedua cabang kemudian dapat didorong tanpa kekuatan!

teh_senaus
sumber
Tetapi kemudian Anda harus berurusan dengan skenario revert, yang, tergantung pada keadaan Anda, bisa menjadi jauh lebih rumit. Jika Anda mengembalikan komit di cabang, Git masih akan melihat komit tersebut telah terjadi, jadi untuk membatalkannya, Anda harus mengembalikan revert. Ini membakar beberapa orang, terutama ketika mereka mengembalikan gabungan dan mencoba untuk menggabungkan cabang kembali, hanya untuk menemukan bahwa Git percaya bahwa itu sudah menggabungkan cabang itu (yang sepenuhnya benar).
Makoto
1
Itu sebabnya saya memilih tugas di akhir, ke cabang baru. Dengan begitu git melihat mereka sebagai commit baru, yang menyelesaikan masalah Anda.
teh_senaus
Ini lebih berbahaya daripada yang pertama kali terlihat, karena Anda mengubah keadaan sejarah repositori tanpa benar-benar memahami implikasi dari keadaan ini.
Makoto
5
Saya tidak mengikuti argumen Anda - inti dari jawaban ini adalah bahwa Anda tidak mengubah riwayat, cukup menambahkan komit baru (yang secara efektif membatalkan pengulangan perubahan). Komit baru ini dapat didorong dan digabung seperti biasa.
teh_senaus
13

Baru saja situasi ini:

Branch one: A B C D E F     J   L M  
                       \ (Merge)
Branch two:             G I   K     N

Saya tampil:

git branch newbranch 
git reset --hard HEAD~8 
git checkout newbranch

Saya berharap komit itu saya akan menjadi KEPALA, tetapi komit L itu sekarang ...

Untuk memastikan untuk mendarat di tempat yang tepat dalam sejarah lebih mudah untuk bekerja dengan hash dari commit

git branch newbranch 
git reset --hard #########
git checkout newbranch
Darkglow
sumber
9

Bagaimana saya bisa pergi dari ini

A - B - C - D - E 
                |
                master

untuk ini?

A - B - C - D - E 
    |           |
    master      newbranch

Dengan dua perintah

  • cabang git -m master newbranch

memberi

A - B - C - D - E 
                |
                newbranch

dan

  • master cabang git B

memberi

A - B - C - D - E
    |           |
    master      newbranch
Ivan
sumber
Yap, ini berfungsi dan cukup mudah. Sourcetree GUI sedikit bingung tentang perubahan yang dilakukan pada git shell, tetapi setelah mengambilnya tidak apa-apa lagi.
lars k.
Ya, mereka seperti dalam pertanyaan. Beberapa diagram pertama dimaksudkan untuk menjadi setara dengan yang ada di pertanyaan, hanya digambar ulang seperti yang saya inginkan untuk tujuan ilustrasi dalam jawaban. Pada dasarnya ganti nama cabang master sebagai cabang baru dan buat cabang master baru di tempat yang Anda inginkan.
Ivan
Saya percaya ini adalah jawaban yang tepat.
Leonardo Herrera
4

Jika Anda hanya perlu memindahkan semua komitmen Anda yang belum dicabut ke cabang baru , maka Anda hanya perlu,

  1. membuat sebuah cabang baru dari yang sekarang:git branch new-branch-name

  2. dorong cabang baru Anda :git push origin new-branch-name

  3. kembalikan cabang lama Anda (saat ini) ke kondisi push / stable terakhir:git reset --hard origin/old-branch-name

Beberapa orang juga memiliki upstreamsselain originmereka harus menggunakan yang sesuaiupstream

Shamsul Arefin Sajib
sumber
3

1) Buat cabang baru, yang memindahkan semua perubahan Anda ke new_branch.

git checkout -b new_branch

2) Kemudian kembali ke cabang lama.

git checkout master

3) Lakukan git rebase

git rebase -i <short-hash-of-B-commit>

4) Kemudian editor yang dibuka berisi 3 informasi komit terakhir.

...
pick <C's hash> C
pick <D's hash> D
pick <E's hash> E
...

5) Ubah pickke dropdalam semua 3 komitmen tersebut. Kemudian simpan dan tutup editor.

...
drop <C's hash> C
drop <D's hash> D
drop <E's hash> E
...

6) Sekarang 3 komit terakhir dihapus dari cabang saat ini ( master). Sekarang dorong cabang dengan paksa, dengan +tanda sebelum nama cabang.

git push origin +master
rashok
sumber
2

Anda dapat melakukan ini hanya 3 langkah sederhana yang saya gunakan.

1) buat cabang baru tempat Anda ingin melakukan pembaruan terkini kepada Anda.

git branch <branch name>

2) Temukan Id Komit Terbaru untuk komit di cabang baru.

git log

3) Salin catatan komit yang daftar komit terbaru terjadi di atas. sehingga Anda dapat menemukan komit Anda. Anda juga menemukan ini melalui pesan.

git cherry-pick d34bcef232f6c...

Anda juga dapat memberikan beberapa nomor komit.

git cherry-pick d34bcef...86d2aec

Sekarang pekerjaanmu selesai. Jika Anda memilih id yang benar dan cabang yang benar maka Anda akan berhasil. Jadi sebelum ini berhati-hatilah. kalau tidak masalah lain bisa terjadi.

Sekarang Anda dapat mendorong kode Anda

git push

Pankaj Kumar
sumber
0

Cara lain untuk melakukan ini:

[1] Ubah nama mastercabang menjadi milik Anda newbranch(dengan asumsi Anda ada di mastercabang):

git branch -m newbranch

[2] Buat mastercabang dari komit yang Anda inginkan:

git checkout -b master <seven_char_commit_id>

misalnya git checkout -b master a34bc22

Saikat
sumber