Bersihkan garpu dan mulai ulang dari hulu

396

Saya telah membuat repositori, lalu saya membuat beberapa perubahan dan sepertinya saya telah mengacaukan semuanya.

Saya ingin memulainya lagi dari awal, menggunakan hulu / master saat ini sebagai dasar untuk pekerjaan saya.
Haruskah saya mengubah repositori saya atau menghapusnya sama sekali?

tampe125
sumber
4
Jawaban yang sangat kompleks untuk pertanyaan sederhana. Hapus saja semuanya dan tiru repositori lagi.
Yaza
1
@ Yaza, tidak, ini mungkin menyebabkan Anda semakin kesulitan dalam beberapa skenario.
Shimmy Weitzhandler
@immy, tidak jika Anda ingin memulai lagi dari awal seperti yang diminta OP.
Yaza

Jawaban:

796

Solusi paling sederhana adalah (menggunakan ' upstream' sebagai nama jarak jauh yang merujuk pada repo asli bercabang):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Mirip dengan halaman GitHub ini , bagian "Apa yang harus saya lakukan jika saya dalam situasi yang buruk?" )

Ketahuilah bahwa Anda dapat kehilangan perubahan yang dilakukan pada mastercabang (baik secara lokal, karena reset --hard, dan pada sisi jarak jauh, karena push --force).

Alternatifnya adalah, jika Anda ingin mempertahankan komitmen Anda master, untuk mengulang komitmen itu di atas arus upstream/master.
Ganti bagian reset dengan a git rebase upstream/master. Anda kemudian masih harus memaksa push.
Lihat juga " Apa yang harus saya lakukan jika saya dalam situasi yang buruk? "


Solusi yang lebih lengkap, mencadangkan pekerjaan Anda saat ini (untuk berjaga-jaga) dirinci dalam " Bersihkan cabang master git dan pindahkan beberapa komit ke cabang baru ".

Lihat juga " Tarik pembaruan baru dari repositori GitHub asli ke dalam repositori GitHub bercabang " untuk menggambarkan apa " upstream" itu.

ke hulu


Catatan: repo GitHub baru-baru ini melindungi mastercabang terhadap push --force.
Jadi, Anda harus melepaskan masterdulu proteksi (lihat gambar di bawah), dan kemudian melindunginya kembali setelah mendorong paksa ).

masukkan deskripsi gambar di sini


Catatan: khususnya di GitHub, sekarang ada (Februari 2019) jalan pintas untuk menghapus repo bercabang untuk permintaan tarik yang telah digabung ke hulu.

VONC
sumber
4
hai, itu bekerja dengan baik! btw sintaks reset yang benar adalahgit reset --hard upstream/master
tampe125
1
@ tampe125 Luar Biasa. Saya telah memperbaiki sintaks git resetdalam jawabannya.
VonC
fatal: 'upstream' tampaknya bukan repositori git
Benubird
@Benubird yang merupakan nama dari remote yang merujuk pada repo asli (yang Anda forked): lihat grafik dan perintah " git remote" di stackoverflow.com/a/3903835/6309 .
VonC
Benar, tetapi tidak jelas dari pertanyaan Anda cara mengaturnya, karena secara default 'upstream' tidak didefinisikan dalam baris perintah saat saya bercabang melalui github.
Benubird
31

Love VonC menjawab. Ini versi mudah untuk pemula.

Ada remote git bernama originyang saya yakin Anda semua tahu. Pada dasarnya, Anda dapat menambahkan sebanyak mungkin remote ke repo git seperti yang Anda inginkan. Jadi, yang bisa kita lakukan adalah memperkenalkan remote baru yang merupakan repo asli bukan garpu. Saya suka menyebutnyaoriginal

Mari tambahkan repo asli ke garpu kami sebagai remote.

git remote add original https://git-repo/original/original.git

Sekarang mari kita ambil repo asli untuk memastikan kita memiliki kode terbaru

git fetch original

Seperti, VonC menyarankan, pastikan kita berada di master.

git checkout master

Sekarang untuk meningkatkan kecepatan dengan kode terbaru pada repo asli, yang harus kita lakukan adalah mengatur ulang cabang master kita sesuai dengan remote asli.

git reset --hard original/master

Dan Anda selesai :)

Ahmad Awais
sumber
2
Saya memulai fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.langkah terakhir. Ada saran?
TomNorway
Tampaknya ini hanya membuat Anda persediaan di cabang jauh asli. Saya menganggap ini tidak ada langkah untuk mengatur ulang garpu ANDA kembali ke remote yang benar?
Ray Suelzer
1
originallebih baik daripada upstream(yang menggunakan Github docs), seperti origin/master"hulu" lokal master. Mengurangi ambiguitas. Saya ingin tahu apakah ini sebabnya Anda menggunakannya?
vaughan
1
Itulah mengapa saya menggunakannya!
Ahmad Awais
2
Saya mengikuti instruksi ini dan sekarang status git mengatakan: Pada master cabang, cabang Anda dan 'asal / master' telah berbeda, dan masing-masing memiliki 52 dan 5 komit yang berbeda. (gunakan "git pull" untuk menggabungkan cabang jarak jauh ke cabang Anda) - tetapi saya ingin membuang 5 commit saya. Apa langkah selanjutnya?
user3562927
6

Mengikuti @VonC jawaban yang bagus. Kebijakan perusahaan GitHub Anda mungkin tidak mengizinkan 'force push' on master.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Jika Anda mendapatkan pesan kesalahan seperti ini, silakan coba langkah-langkah berikut.

Untuk mengatur ulang garpu secara efektif, Anda harus mengikuti langkah-langkah ini:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

Buka garpu Anda di GitHub, di "Pengaturan -> Cabang -> Cabang default" pilih 'new_master' sebagai cabang default baru. Sekarang Anda dapat mendorong paksa pada cabang 'master':

git checkout master
git push --force origin

Maka Anda harus mengatur kembali 'master' sebagai cabang default di pengaturan GitHub. Untuk menghapus 'tmp_master':

git push origin --delete tmp_master
git branch -D tmp_master

Jawaban lain memperingatkan tentang kehilangan perubahan Anda masih berlaku, hati-hati.

Hugodby
sumber
4

Cara melakukannya 100% melalui GUI Sourcetree

(Tidak semua orang suka melakukan sesuatu melalui antarmuka baris perintah git)

Setelah ini diatur, Anda hanya perlu melakukan langkah 7-13 sejak saat itu.

Ambil> checkout cabang utama> atur ulang ke master mereka> Dorong perubahan ke server

Langkah

  1. Di bilah alat menu di bagian atas layar: "Repositori"> "Pengaturan repositori"

"Repositori" disorot di bilah menu atas

  1. "Menambahkan"

Tombol "Tambah" di bagian bawah dialog

  1. Kembali ke GitHub dan salin URL klon.

Tombol "Kloning atau Unduh" di situs web Github diikuti oleh url git

  1. Rekatkan url ke bidang "URL / Path" lalu berikan nama yang masuk akal. Saya menyebutnya "tuan". Jangan centang kotak "Default remote" . Anda tidak akan bisa mendorong langsung ke repositori ini.

Kolom "Nama jauh" dan "URL / Jalur" disorot dalam dialog "Detail jauh"

  1. Tekan "OK" dan Anda akan melihatnya muncul di daftar repositori Anda sekarang.

repositori "master" ditambahkan ke daftar repositori dalam dialog "Pengaturan repositori"

  1. Tekan "OK" lagi dan Anda akan melihatnya muncul di daftar "Remote".

repositori "master" disorot dalam daftar remote di bilah samping

  1. Klik tombol "Ambil" (kiri atas area header pohon Sumber)

Tombol "Ambil" di area tajuk

  1. Pastikan kotak centang "Ambil dari semua jarak jauh" dicentang dan tekan "ok"

Kotak centang "Ambil dari semua remote" yang disorot dalam dialog "Ambil"

  1. Klik dua kali pada cabang "master" Anda untuk memeriksanya jika belum dicentang.

  2. Temukan komit yang ingin Anda atur ulang, jika Anda memanggil repo "master", kemungkinan besar Anda ingin menemukan komit dengan tag "master / master" di atasnya.

Contoh komit dengan tag "master / master" di atasnya

  1. Klik kanan pada komit> "Setel ulang cabang saat ini ke komit ini".

  2. Dalam dialog, setel bidang "Menggunakan mode:" ke "Hard - abaikan semua perubahan salin yang berfungsi" lalu tekan "OK" (pastikan untuk meletakkan perubahan yang tidak ingin Anda hilangkan ke cabang terpisah terlebih dahulu).

"Menggunakan mode" bidang disorot dalam dialog "Reset untuk melakukan".  Sudah diatur untuk "membuang semua perubahan copy pekerjaan"

  1. Klik tombol "Push" (kiri atas area header pohon Source) untuk mengunggah perubahan ke salinan repo Anda.

"Tekan" tombol di area header

Selesai!

Daniel Tonon
sumber