Kesalahan: Tidak dapat menarik dengan rebase: Anda memiliki perubahan yang tidak dipentaskan

138

Saya sudah mulai berkolaborasi dengan beberapa teman di sebuah proyek & mereka menggunakan repositori heroku git.

Saya mengkloning repositori beberapa hari yang lalu dan mereka telah membuat beberapa perubahan jadi saya mencoba untuk mendapatkan pembaruan terbaru

Saya menjalankan git pull --rebaseperintah seperti yang dinyatakan di sini (Apakah ini cara yang tepat untuk melakukannya?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Saya mendapatkan kesalahan berikut:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Dugaan saya adalah bahwa saya mengotak-atik kode dan sekarang ingin saya melakukan atau membuang (apakah itu artinya simpanan?) Perubahan. Inikah yang terjadi? Jika ini masalahnya, saya ingin membuang perubahan yang mungkin telah saya buat dan hanya mendapatkan kode yang diperbarui dari repositori git.

Adakah yang bisa saya lakukan?

pengguna3597950
sumber

Jawaban:

173

Lakukan git status, ini akan menunjukkan kepada Anda file apa yang telah berubah. Karena Anda menyatakan bahwa Anda tidak ingin menyimpan perubahan yang dapat Anda lakukan git checkout -- <file name>atau git reset --harduntuk menyingkirkan perubahan.

Untuk sebagian besar, git akan memberi tahu Anda apa yang harus dilakukan tentang perubahan. Misalnya, pesan kesalahan Anda mengatakan git stashperubahan Anda. Ini akan terjadi jika Anda ingin menyimpannya. Setelah menarik, Anda akan melakukannya git stash popdan perubahan Anda akan diterapkan kembali.

git status juga memiliki cara untuk menyingkirkan perubahan tergantung pada apakah file tersebut dipentaskan untuk melakukan atau tidak.

Schleis
sumber
1
Ini sepertinya bekerja tetapi sekarang saya menghadapi kesalahan lain (memulai pertanyaan baru untuk tidak membingungkan calon pengunjung): stackoverflow.com/questions/23518247/…
user3597950
Saya benar-benar mengalami ini setiap saat, baru-baru ini. Sebelumnya, menarik file yang tidak memengaruhi perubahan Anda saat ini baik-baik saja, tetapi sekarang, itu membutuhkan semua yang telah Anda ubah untuk disimpan. Saya bahkan tidak bisa mendorong, saya terpaksa menggunakangit push -f
Karma Blackshaw
@KarmaBlackshaw Anda tidak perlu memaksakan dorongan. Jika Anda harus melakukan push force, itu berarti bahwa sejarah lokal Anda dan sejarah jauh berbeda dan itu adalah pertanyaan yang berbeda dari apa yang dicakup oleh jawaban ini.
Schleis
Memang berbeda dengan apa yang disediakan ruang lingkup pertanyaan ini. Tetapi saya menemukan cara dengan menghapus cabang saat ini dan membuat cabang baru dari pengembangan. Saya kira itu adalah cabang saya yang memiliki beberapa hal dikonfigurasi dengan salah.
Karma Blackshaw
91

Jika Anda ingin menjaga perubahan kerja Anda saat melakukan rebase, Anda dapat menggunakan --autostash. Dari dokumentasi :

Sebelum memulai rebase, simpanan modifikasi lokal (lihat git-simpanan [1] ) jika perlu, dan terapkan simpanan saat selesai.

Sebagai contoh:

git pull --rebase --autostash
mkobit
sumber
7
Ini adalah jawaban modern.
adl
13
Jika Anda ingin autostash menjadi perilaku default yang dapat Anda atur git config --global rebase.autoStash true maka Anda tidak perlu melewati sakelar.
Zoredache
1
INI, apa yang saya cari! (perhatikan bahwa saklar baris perintah tersedia dari git 2.9, tetapi opsi rebase.autostashtersedia dari 2.6).
jjmontes
Ini juga sangat bagus git rebase --interactive!
Dan Dascalescu
6
Mengapa ini bukan default?
Nick
49

Menarik dengan rebase adalah praktik yang baik secara umum.

Namun Anda tidak dapat melakukan itu jika indeks Anda tidak bersih, yaitu Anda telah membuat perubahan yang belum dilakukan.

Anda dapat melakukan ini untuk mengatasi, dengan asumsi Anda ingin menyimpan perubahan Anda:

  1. sembunyikan perubahan Anda dengan: git stash
  2. tarik dari tuan dengan rebase
  3. mengajukan kembali perubahan yang Anda sembunyikan (1) dengan: git stash apply stash@{0}atau yang lebih sederhanagit stash pop
Kostas Rousis
sumber
1
Ini sepertinya bekerja tetapi sekarang saya menghadapi kesalahan lain (memulai pertanyaan baru untuk tidak membingungkan calon pengunjung): stackoverflow.com/questions/23518247/…
user3597950
6
@nehemiahjacob Anda juga git stash popdapat menerapkan perubahan yang disimpan terakhir dan untuk menghindari menghafal lebih lama apply stash@{0}.
Kostas Rousis
Saya harus melakukan ini sepanjang waktu. Adakah cara yang lebih mudah?
Alper
@alper biasanya Anda bekerja pada cabang (fitur) lain. Dalam pengalaman saya, saya hanya mengambil dan memberontak terhadap tuan setelah saya melakukan pekerjaan saya, jadi tidak perlu simpanan / pop. Jika Anda sering melakukan hal itu selama alur kerja pengembangan, Anda selalu dapat membuat alias di .bashrc(atau apa pun yang Anda gunakan):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis
@KostasRousis Saya punya alias yang tepat, lol. Saya menyebutnya 'sppgit'
luizfls
30

Pertama mulai dengan a git status

Lihat apakah Anda memiliki perubahan yang tertunda. Untuk membuangnya, jalankan

git reset --hard
Igal S.
sumber
Ini sepertinya bekerja tetapi sekarang saya menghadapi kesalahan lain (memulai pertanyaan baru untuk tidak membingungkan calon pengunjung): stackoverflow.com/questions/23518247/…
user3597950
16

Ini bekerja untuk saya:

git fetch
git rebase --autostash FETCH_HEAD
CppChase
sumber
1
Ah autostash, itu menyelamatkan saya dua perintah tambahan. Ini harus menjadi jawaban IMO yang benar.
Erik Berkun-Drevnig
10

Anda selalu bisa melakukannya

git fetch && git merge --ff-only origin/master

dan Anda tidak akan mendapatkan (a) tidak ada perubahan jika Anda memiliki perubahan yang tidak dikomit yang bertentangan dengan perubahan hulu atau (b) efek yang sama dengan simpanan / tarik / terapkan: rebase untuk menempatkan Anda pada perubahan terbaru dari HEAD dan perubahan yang tidak dikomit Anda dibiarkan dengan adanya.

Jared Updike
sumber
6

Ketika perubahan yang tidak dipentaskan adalah karena git berusaha untuk memperbaiki konvensi eol pada file (seperti yang selalu terjadi pada saya), tidak ada jumlah simpanan atau check-out atau pengaturan ulang yang akan membuatnya hilang.

Namun, jika maksud adalah benar-benar untuk rebase dan mengabaikan area stage berubah, maka apa yang saya lakukan adalah menghapus cabang lokal kemudian memeriksanya lagi.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Voila! Saya belum gagal.

tggagne
sumber
2

Jika Anda ingin menyimpan perubahan Anda secara otomatis dan melepaskannya untuk setiap rebase, Anda dapat melakukan ini:

git config --global rebase.autoStash true
agirault
sumber
1
Ini adalah satu-satunya jawaban yang membuat Git versi terbaru bekerja dengan cara yang sama seperti yang selalu dilakukan Git di masa lalu. Mengapa membuat orang menambahkan --autostashketika itu hanya bisa ... otomatis?
Andrew Koster