Git, Bagaimana cara mereset asal / master ke komit?

245

Saya mereset master lokal saya ke komit dengan perintah ini:

git reset --hard e3f1e37

ketika saya memasukkan $ git statusperintah, terminal mengatakan:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Karena saya ingin mengatur ulang origin / header juga, saya checkout ke origin / master:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

dan setel ulang tajuk dengan perintah ini:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Kemudian saya mencoba menambahkan commit ke origin / header yang saya tidak berhasil.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Akhirnya, saya checkout ke master lokal saya.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Karena, saya mengatur ulang kepala asal / master yang saya harapkan lokal dan asal harus di arah yang sama tetapi seperti yang Anda lihat, git mengatakan bahwa lokal / master saya di belakang asal / master dengan 7 komit.

Bagaimana saya bisa memperbaiki masalah ini? Hal-hal yang saya cari adalah Kepala / master dan asal / master point untuk komit yang sama. Gambar berikut menunjukkan apa yang saya lakukan. Terima kasih.

masukkan deskripsi gambar di sini

Hesam
sumber
Pertama-tama, pastikan Anda diizinkan untuk memaksakan kode push ke cabang yang dilindungi pada proyek Anda, jika tidak, Anda tidak akan bisa ...
DarmVillegas

Jawaban:

563

origin/xxxcabang selalu pointer ke remote. Anda tidak dapat memeriksanya karena mereka bukan penunjuk ke repositori lokal Anda (Anda hanya memeriksa komit. Itulah sebabnya Anda tidak akan melihat nama yang ditulis dalam penanda cabang antarmuka baris perintah, hanya hash komit).

Yang perlu Anda lakukan untuk memperbarui remote adalah memaksa mendorong perubahan lokal Anda untuk dikuasai:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master
Simon Boudrias
sumber
9
yang melakukan operasi yang diminta, tetapi perlu diingat bahwa itu akan membuat orang-orang yang sudah menarik komitmen dari master tidak bahagia.
mnagel
Saya mengikuti langkah-langkah ini dan itu bergulir kembali. Tapi asal / KEPALA sekarang menunjuk ke cabang selain tuan. Apa yang bisa saya lakukan untuk memperbaikinya?
Daniil Shevelev
1
Anda seharusnya tidak peduli dengan asal / KEPALA, cukup tekan ref yang baik ke asal / ref
Simon Boudrias
Setuju, harus melakukan ini hari ini setelah tidak sengaja menggabungkan cabang yang salah bersama-sama kemudian mendorong ke asal. Ini bekerja dengan baik, tetapi bisa sangat mengganggu jika orang lain telah memeriksa cabang yang terkena dampak dari asal. Gunakan dengan hati-hati.
Nick W.
1
Tidak bekerja remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
52

Solusi yang ditemukan di sini membantu kami memperbarui master ke komit sebelumnya yang telah didorong:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

Perbedaan utama dari jawaban yang diterima adalah hash komit "e3f1e37:" sebelum master dalam perintah push.

jkovacs
sumber
1
Tidak berfungsi:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0
@ m0skit0 sebagai pesan say you should pull first:)
intuitifivepixel
Jawabannya ada di stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falsetetapi sebenarnya saya mengaturnya secara manual di repositori git lokal saya yang saya miliki /opt/gityang saya buat untuk bermain dengan ide-ide di sini. Saya tidak yakin bagaimana atau apakah dapat melakukan ini untuk bitbucket, github dll ... Dan @intuitivepixel tidak ada gunanya karena membalikkan apa yang ingin Anda capai dengan hard reset.
HankCa
Hai @jkovacs, saya tidak ingin perubahan baru pada master dihapus. Saya hanya ingin mendorong hash komit itu "e3f1e37" ke master asal. Apakah mungkin dengan melewatkan perintah ke-2 git reset --hard "e3f1e37"?
KarenAnne
Hai @jkovacs, saya baru saja mengkonfirmasi bahwa saya dapat melewati langkah ke-2. :)
KarenAnne
2

Dengan asumsi bahwa cabang Anda dipanggil di mastersini dan dari jarak jauh, dan bahwa kendali jarak jauh originAnda disebut dapat Anda lakukan:

git reset --hard <commit-hash>
git push -f origin master

Namun, Anda harus menghindari melakukan ini jika ada orang lain yang bekerja dengan repositori jarak jauh Anda dan telah menarik perubahan Anda. Dalam hal ini, akan lebih baik untuk mengembalikan komit yang tidak Anda inginkan, kemudian dorong seperti biasa.

Mahmoud Zaher
sumber
1

Karena saya memiliki situasi yang sama, saya pikir saya akan membagikan situasi saya dan bagaimana jawaban ini membantu saya (terima kasih semuanya).

Jadi saya memutuskan untuk bekerja secara lokal dengan mengubah komit terakhir saya setiap kali saya ingin menyelamatkan kemajuan saya di cabang utama (saya tahu, saya seharusnya bercabang, berkomitmen pada hal itu, terus mendorong dan kemudian bergabung kembali untuk menguasai).

Suatu malam, dalam ketakutan paranoid kehilangan kemajuan saya untuk kegagalan perangkat keras atau sesuatu dari eter, saya memutuskan untuk mendorong master ke asal. Kemudian saya terus mengubah cabang master lokal saya dan ketika saya memutuskan sudah waktunya untuk mendorong lagi, saya dihadapkan dengan cabang-cabang master yang berbeda dan menemukan bahwa saya tidak dapat mengubah asal / hulu ( ya! ) Seperti saya dapat cabang pengembangan lokal.

Jadi saya tidak checkout master lokal karena saya sudah setelah komit. Tuan tidak berubah. Saya bahkan tidak perlu mengatur ulang --hard, komit saya saat ini OK.

Saya hanya dipaksa mendorong ke tempat asal, bahkan tanpa menentukan komit apa yang ingin saya paksa pada tuan karena dalam hal ini adalah apa pun KEPALA. Diperiksa git diff master..origin/mastersehingga tidak ada perbedaan dan hanya itu. Semua sudah diperbaiki. Terima kasih! (Saya tahu, saya seorang pemula git, tolong maafkan!).

Jadi, jika Anda sudah setuju dengan cabang master Anda secara lokal, cukup:

git push --force origin master
git diff master..origin/master
Paul-Sebastian Manole
sumber