Pertanyaan Buat komitmen menggantung tanpa memeriksa


Apakah ada cara untuk diam-diam membuat komitmen itu

  • Tidak terhubung ke cabang saat ini
  • Tidak diperiksa setelahnya

seperti

A-B-C-D-E-F-G   # master
       \   \
        X   Y

Dimana X dan Y dibuat tanpa pemberitahuan pengguna.

Alasannya:

Saya menulis banyak kode eksperimen eksplorasi dan ingin secara otomatis melakukan status saat ini ketika menjalankan eksperimen. Negara-negara menengah ini seharusnya tidak berakhir dalam sejarah Git saya dan saya tidak ingin melalui overhead mental melakukan sebelum menjalankan sepanjang waktu (atau melupakannya setiap sekarang dan kemudian).

Idenya adalah memiliki banyak komitmen menggantung yang tidak akan didorong ke remote saya dan dapat dihapus oleh pengumpulan sampah. Setiap individu berkomitmen SHA1 akan dianotasikan ke hasil percobaan saya, memungkinkan saya untuk melacak kembali perubahan apa yang berpengaruh pada hasil.


5
2017-07-27 15:30


asal


Jawaban:


Anda dapat menggunakan git commit-tree perintah untuk membuat komit menjuntai.

Pertama, pentas file yang ingin Anda komit, misalnya, dengan melakukan git add file.

Selanjutnya, buat pohon dari indeks.

git write-tree

Ini akan mencetak hash ke stdout. Itu adalah hash dari pohon yang ingin Anda komit. Katakanlah hash itu 12345678.

Sekarang setelah Anda memiliki pohon untuk indeks, Anda dapat melumpuhkan perubahan sehingga Anda tidak akan berkomitmen "tidak nyata" karena kesalahan. (git reset HEAD file.)

Akhirnya, buat komit dari pohon itu.

git commit-tree 12345678 -p HEAD -m "Description"

Ini membuat commit baru dan mencetak hash ke stdout. Orang tua komit adalah HEAD dan komentarnya Description.

Sebagai pengingat, ini adalah komitmen yang menggantung dan karena itu akan tunduk pada GC.


3
2017-07-27 18:03



Jika kamu melakukan

$ git commit -m 'Foo'
[my_branch b54ed59] Foo
$ git reset --hard HEAD^

Anda akan menemukan bahwa commit yang Anda reset belum hilang, tetapi masih ada, sehingga Anda bisa melakukannya

git checkout b54ed59

dan kembali ke komitmen itu, menjuntai dari cabang Anda.

Menandai komit akan memungkinkan Anda untuk melestarikannya selamanya.


2
2017-07-27 15:54



Cara yang lebih sederhana daripada git commit-tree Saya menyarankan dalam jawaban lain adalah untuk membuat kepala terpisah dan berkomitmen ke dalamnya.

git checkout HEAD^{commit}

Ini membuat Anda tetap pada komitmen yang sama, tetapi Anda sekarang terpisah dari cabang, sehingga setiap commit di masa depan tidak akan memperbarui cabang. Komit perubahan Anda, dan kemudian periksa kembali cabang asli, biarkan komit Anda menggantung.


2
2017-07-27 18:37



Menjaga sejarah Anda:

Saya akan memberi Anda jawaban untuk mencapai tujuan Anda, tetapi dalam pola pikir yang berbeda dari apa yang Anda minta. Meskipun Anda bisa bertahan dengan memiliki komitmen mengambang di reflog, kami tidak melakukan itu di sini.

Anda akan membuat serangkaian komitmen ke satu cabang. Anda peduli tentang setiap komitmen, karena Anda perlu mereferensikannya dari tes Anda. Setelah Anda memiliki cabang kerja, dan Anda ingin berbagi pekerjaan Anda dengan remote, kami akan mengubah sejarah kami.

Asumsi:

Anda punya origin/master, master, dan dev cabang

Bagaimana caranya:

Kami membutuhkan dua set kode. Jika Anda tidak ingin melakukan ini berulang kali, kami dapat menyimpannya sebagai fungsi .bashrc. Setiap kali Anda menjalankan kode Anda, Anda akan memanggil fungsi yang secara otomatis melakukan dan menjalankan kode.

1) berkomitmen setiap kali Anda menjalankan kode:

git add --all
git commit --allow-empty-message -m '' 
<command for running code>

Sekarang Anda akan memiliki SHA1 untuk setiap run, dan Anda akan memiliki riwayat pengembangan Anda (lokal). Untuk menunjukkan apa yang dilakukan setiap komit, Anda dapat melakukan git log --patch untuk menunjukkan perubahan garis untuk setiap commit.

Selanjutnya kita akan mengubah sejarah kita sebelum membagikannya dengan remote. Kami akan menekan semua perubahan Anda menjadi satu commit.

2) berbagi pekerjaan Anda dengan remote:

git checkout master
git merge --squash dev
git commit -m "<commit message for dev history>"
#fetch & push to origin/master after dealing with any remote issues.

Ini mengambil semua patch dari setiap commit kecil, dan menggabungkan semuanya menjadi satu patch, dengan satu SHA1 dan satu pesan.

Pada titik ini, Anda dapat memperbarui paksa cabang dev dengan histori baru Anda git branch -f dev, dan kemudian pengumpulan sampah dapat mengambil komitmen yang telah Anda gepeng.

Kesimpulan

Ini menyelesaikan tujuan Anda menangani banyak komit yang tidak akan didorong ke remote Anda dan mungkin dihapus oleh pengumpulan sampah (setelah Anda selesai dengan mereka). Setiap individu yang melakukan SHA1 dapat dianotasikan ke hasil percobaan Anda, memungkinkan Anda untuk melacak kembali perubahan apa yang berpengaruh pada hasil untuk setiap kali Anda menjalankan kode. Ini juga memungkinkan Anda untuk mengontrol versi (lokal) perubahan Anda.


0
2017-07-27 17:38