Git commit belum selesai tetapi tidak dapat melanjutkan pada mesin itu

11

Kadang-kadang saya mengalami masalah memiliki kode tidak berkomitmen pada workstation yang tidak siap untuk komit tetapi perlu diselesaikan pada workstation atau laptop yang berbeda.

Apakah ada yang punya solusi untuk masalah ini, seperti "komitmen lunak" atau cara lain untuk mentransfer perubahan ke mesin lain untuk mengerjakannya di tempat lain?

Saya lebih suka tidak dipaksa untuk melakukan dan mendorong perubahan yang tidak diterapkan dengan benar.

csteifel
sumber
2
posting ini agak sulit dibaca (dinding teks). Maukah Anda mengeditnya menjadi bentuk yang lebih baik?
nyamuk
.. terdengar seperti Anda setelah git stash...?
Simon Whitehead
@SimonWhitehead ya tapi bisakah saya memindahkan simpanan git ke komputer lain dengan mudah?
csteifel
Semua komit Git adalah "komit lunak".
user253751

Jawaban:

12

Berikut ini mengasumsikan repo lokal Anda adalah klon dari repo di server lain, misalnya github; dan bahwa Anda memiliki hak untuk membuat perubahan pada server hulu. Dalam contoh saya, saya telah menyebut repo hulu ini "asal". Jalankan git remote showuntuk daftar repo lain, ini dapat memberi Anda petunjuk tentang apa namanya.

Saya sarankan membuat cabang, maka Anda dapat memeriksa cabang di komputer lain. Bahkan, jika Anda membuat cabang segera setelah Anda mulai bekerja, Anda dapat "melakukan" ke cabang Anda, memiliki jejak dan cadangan pekerjaan Anda, tanpa harus memiliki codeset yang stabil. Setelah Anda puas dengan pekerjaan Anda, Anda dapat menggabungkannya kembali ke cabang "master" Anda.

  • Untuk melakukan percabangan repo Anda: git checkout -b MyNewBranch
  • Untuk mendorong perubahan yang dilakukan dari cabang baru Anda: git push origin MyNewBranch
  • Untuk memeriksa cabang di komputer lain: git checkout MyNewBranch
  • Untuk beralih ke cabang lain (mis. "Master"): git checkout master
  • Saat menjadi master, untuk menggabungkan MyNewBranch kembali: git merge MyNewBranch
  • Untuk membuat daftar cabang: git branch
AMADANON Inc.
sumber
3
Ya, selalu bekerja di cabang pribadi Anda sendiri pada dasarnya menyelesaikan masalah ini. Anda dapat melakukan sesering yang Anda inginkan tanpa mempengaruhi orang lain. Yang lebih baik adalah membuat cabang baru setiap kali Anda mulai bekerja pada fitur baru atau mulai memperbaiki cacat baru. Ini membuatnya sangat mudah untuk bolak-balik di antara basis kode.
Gort the Robot
Juga, dan alasan saya melakukan ini: jika Anda membuat kesalahan di tengah jalan, Anda dapat pergi ke commit sebelumnya pada cabang saat ini. Atau, lompat mundur, ambil sepotong, lompat ke depan dan terapkan.
AMADANON Inc.
1
Bukankah metode ini juga termasuk komit yang tidak lengkap di cabang master gabungan?
eimrek
Ya, dan (menurut saya) itu mungkin bukan hal yang buruk. Jika Anda tidak menginginkannya, lakukan yang di atas, lalu alih-alih melakukan kode Anda, buat diff (yang mencakup semua perubahan file, tetapi tidak ada komitmen), terapkan ke salinan cabang baru, lalu dorong itu.
AMADANON Inc.
2
tentang " Untuk beralih ke cabang lain lakukangit branch -d master ", saya bingung, bukankah itu meminta git untuk menghapus cabang master ?? (itulah kesan yang saya dapatkan dari membaca manual cabang git)
Tasos Papastylianou
2

Anda dapat menggunakan git diffuntuk membuat tambalan dan kemudian menerapkannya di mesin lain. Atau Anda dapat membuat komit sementara, lalu tarik dari mesin lain. Anda bahkan dapat membuat cabang sementara di mesin lain, tekan komit sementara Anda di sana, lalu hapus cabang.

Metode favorit saya adalah yang kedua: membuat komit sementara, kemudian pergi ke komputer lain dan melakukan sesuatu seperti ini:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^
aragaer
sumber
Mengapa begitu rumit dan tidak hanya menggunakan git format-patch?
coba-tangkap-akhirnya
Tidak terlalu berbeda dari git diff. Apakah ada sesuatu yang saya lewatkan?
aragaer
1
git format-patch deadbee..badcab1e- Ini membuat .patchfile untuk setiap komit secara terpisah dengan nama yang bagus dan pesan komit dipertahankan.
coba-tangkap-akhirnya
Apakah itu juga membuat tambalan untuk perubahan yang belum dilakukan? Apakah ini memisahkan indeks saat ini dan hal-hal yang belum dipentaskan? Sepertinya tidak.
aragaer
Tidak, tidak untuk perubahan yang tidak dikomit / tidak dipentaskan. Tetapi karena komit tidak melukai orang lain selama Anda tidak memaksanya, komit tidak apa-apa (dengan pesan jelas yang mengatakan "WIP" - sedang berlangsung).
coba-tangkap-akhirnya
2

Saya berkomitmen . Saya mendorongnya ke cabang pribadi , memeriksa di sisi lain dan mengubah. Dan hapus cabang pribadi setelah selesai.

Tentu saja Anda dapat mendorong langsung di antara repo, Anda dapat menggunakan bundel atau format-patch/ am, tetapi cabang pribadi sejauh ini merupakan solusi termudah. Dan menulis ulang sejarah bukanlah masalah besar asalkan tidak didorong ke cabang bersama. Dalam banyak proyek, orang-orang seharusnya memundurkan cabang fitur agar lebih mudah dipahami untuk ditinjau.

Jan Hudec
sumber
0

Pendekatan yang mudah adalah yang Anda jelaskan: salin .gitdirektori tersembunyi dan proyeksikan file ke komputer lain tempat Anda dapat melakukan dan menyelesaikan, atau terus bekerja.

The .gitdirektori di mana sejarah git Anda disimpan, sehingga melestarikan ini bersama dengan file yang sebenarnya membuat seluruh sejarah proyek Anda utuh.

Jika Anda selesai menggunakan mesin asli, saya mungkin akan merekomendasikan pendekatan ini.

joshin4colours
sumber
0

Seperti yang dijawab orang lain, dengan Git Anda tidak perlu peduli dengan kode yang belum selesai di cabang pribadi Anda. Namun, jika karena alasan tertentu, Anda benar-benar benar-benar tidak ingin pekerjaan Anda yang belum selesai menyentuh repo utama, Anda dapat memanfaatkan sifat terdistribusi Git!

Ada alat sederhana bernama git bundleyang dapat membantu Anda dengan mudah melewati perubahan tanpa repositori pusat. Pertama, klon repo:

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

buat beberapa perubahan dan komit ke cabang sementara:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

Sekarang, bundel perubahan itu:

git bundle create ../tmp.bundle tmp_branch

Sekarang Anda memiliki file bundel yang dapat Anda kirim ke mesin baru Anda. Bagaimana Anda menggunakannya di sana? Mari kita membuat copy pekerjaan baru:

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

kita perlu memperlakukan bundel kita sebagai remote lain, sehingga kita dapat mengambil perubahan darinya

git remote add tmp ../tmp.bundle
git fetch tmp

karena intinya adalah untuk mentransfer perubahan tanpa meninggalkan jejak, kami ingin memasukkannya ke dalam copy pekerjaan untuk kehilangan komit temp:

git merge tmp/tmp_branch --squash

dan yang tersisa adalah menghapus remote sementara:

git remote remove tmp

BIOLA! Perubahan ditransfer ke copy pekerjaan baru tanpa meninggalkan jejak cabang atau komit!

Tapi sungguh - proses ini cukup panjang dan rumit. Ini Git, bukan SVN - seharusnya tidak ada alasan untuk tidak mendorong cabang pribadi Anda ke repo pusat.

Idan Arye
sumber