Bagaimana cara menyalin komit dari satu repo Git ke yang lain?

102

Minggu lalu saya membuat repo Github dan lupa memilih lisensi untuk repo tersebut. Sekarang sudah ada 3 komit besar.

Saya telah bertanya kepada 3 kontributor apakah tidak apa-apa, jika saya menghapus repo dan kemudian membuatnya lagi dengan nama yang sama dan kali ini memilih lisensi saat membuat repo, dan mereka baik-baik saja.

Pertanyaan

Apakah ada cara saya mendapatkan komit ke repo baru (kali ini komit pertama adalah file LISENSI) dan masih menyimpan info meta komit?

Jasmine Lognnes
sumber
1
Anda masih dapat menambahkan lisensi ke repo asli. Lihat help.github.com/articles/open-source-licensing/… untuk detailnya.
edwinksl

Jawaban:

172

Apakah ada cara saya mendapatkan komit ke repo baru (kali ini komit pertama adalah file LISENSI) dan masih menyimpan info meta komit?

Ya, dengan menambahkan remote dan memilih ceri komit di atas komit pertama Anda.

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

Jawaban selanjutnya adalah jika Anda masih ingin menambahkan LISENSI ke repo Anda sebelumnya.

Iya. Anda dapat menempatkan komit LISENSI Anda sebagai komit pertama dengan melakukan rebasing.

Rebasing adalah cara gits untuk mengatur ulang urutan komit sambil menjaga semua penulis komit dan tanggal komit tetap utuh.

Saat mengerjakan repo bersama, biasanya tidak disarankan kecuali seluruh tim Anda fasih. Bagi yang tidak, mereka bisa mengkloning salinan baru dari repositori.

Inilah cara Anda mendapatkan LISENSI Anda komit sebagai komit pertama.

1. Perbarui dan susun ulang salinan lokal Anda

Periksa proyek Anda dan tempatkan file LISENSI di commit ON TOP dari 3 commit stack Anda saat ini.

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

Kemudian lakukan rebase interaktif pada cabang master untuk MENGATUR ulang komit.

git rebase -i --root

Ini akan membuka editor. Pindahkan baris terbawah (komit "Awal" Anda, komit terbaru) ke bagian atas file. Kemudian simpan dan keluar dari editor.

Segera setelah Anda keluar dari editor, git akan menulis komit dalam urutan yang baru saja Anda tentukan.

Anda sekarang memiliki salinan lokal repositori Anda yang diperbarui. melakukan:

git log

untuk memverifikasi.

2. Paksa push status repo baru Anda ke github

Sekarang salinan Anda diperbarui, Anda harus mendorongnya secara paksa ke github.

git push -f origin master

Ini akan memberi tahu github untuk memindahkan cabang master ke lokasi barunya. Anda sebaiknya hanya memaksakan push pada kesempatan yang jarang terjadi seperti ini di mana semua orang yang bekerja dengannya mengetahui perubahan yang menunggu, jika tidak maka akan membingungkan kolaborator Anda.

3. Sinkronisasi kolaborator ke github

Terakhir, semua kolaborator harus melakukan sinkronisasi ke repositori ini.

Pertama, mereka harus memiliki repositori yang bersih karena perintah berikut dapat merusak jika ada perubahan yang belum disimpan.

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

Itu dia. Semua orang harus sinkron sekarang.

Moocowmoo
sumber
1
Jawaban yang bagus! Terima kasih!
Kyrol
Menghemat banyak waktu. Terima kasih!
an0nh4x0r
9

Saya memiliki masalah serupa di mana saya lupa membayar repo ke github saya dan menambahkan beberapa commit sebelum saya menyadari kesalahan saya.

Saya menemukan solusi yang cukup sederhana.

Pertama, lepas remote ke repo asli

git remote remove origin

Kedua, tambahkan remote ke garpu baru di github saya

git remote add origin <my repo URL>

Kemudian saya mendorong ke master asal dan semua komitmen saya muncul di github saya.

Russ Bain
sumber
1
Hanya untuk menambahkan ini, ketika saya mendorong, saya harus melakukannya git push --set-upstream origin master, tetapi Git membuat Anda menyadari hal ini.
MRichards
solusi hebat dan mudah!
mekograf
3
  • Destination Git = UrlD (konten yang ada tidak masalah)
  • SourceGit = UrlS

    git clone UrlS
    
    git remote add origin2 UrlD
    
    git push -f origin2 master
    

Sekarang Tujuan akan memiliki data yang sama dengan Sumber (Anda juga dapat menggunakan origin, bukan origin2)

Awan Biru
sumber
0

Saya menggunakan pendekatan berikut:

  • Clone repo sumber ke folder seperti / c / SrcRepo

  • Clone repo tujuan ke folder seperti / c / DstRepo dan alihkan ke cabang tujuan

  • Di folder root dari repo tujuan, jalankan perintah:

    git pull / c / SrcRepo srcBranch --allow-unrelated-histories

Tidak perlu membuat referensi jarak jauh tambahan

MirrorBoy
sumber