Saya baru-baru ini bercabang proyek dan diterapkan beberapa perbaikan. Saya kemudian menciptakan permintaan tarik yang kemudian diterima.
Beberapa hari kemudian perubahan lain yang dibuat oleh kontributor lain. Jadi saya garpu doesn't mengandung perubahan itu.
Bagaimana saya bisa mendapatkan yang berubah menjadi garpuku? Apakah saya harus menghapus dan membuat ulang garpu saya ketika saya memiliki perubahan lebih lanjut untuk berkontribusi? Atau ada sebuah tombol update?
Di lokal anda clone anda bercabang repositori, anda dapat menambahkan asli repositori GitHub sebagai "remote". ("Remote" seperti julukan untuk Url repositori - asal
adalah salah satu, misalnya.) Kemudian anda dapat mengambil semua cabang-cabang dari hulu repositori, dan rebase pekerjaan anda untuk terus bekerja pada hulu versi. Dalam hal perintah yang mungkin terlihat seperti:
# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
Jika anda don't ingin menulis ulang sejarah dari master branch, (misalnya karena orang lain mungkin telah dikloning) maka anda harus mengganti perintah terakhir dengan git merge hulu/master
. Namun, untuk membuat lebih menarik permintaan yang sebersih mungkin, it's mungkin lebih baik untuk rebase.
Jika anda've rebased cabang ke hulu/master
anda mungkin perlu untuk memaksa mendorong dalam rangka untuk mendorong itu untuk anda sendiri bercabang repositori di GitHub. Anda'd dilakukan dengan:
git push -f origin master
Anda hanya perlu menggunakan -f
pertama kali setelah anda've rebased.
Mulai Mei 2014, adalah mungkin untuk update garpu langsung dari GitHub. Ini masih bekerja sebagai September 2017, TAPI hal itu akan menyebabkan kotor komit sejarah.
Update dari asli
).Sekarang anda memiliki tiga pilihan, tetapi masing-masing akan menyebabkan kurang-dari-bersih komit sejarah.
cabang Ini adalah X berkomitmen ke depan, Y melakukan balik <asli fork>
.Jadi ya, anda dapat menjaga anda repo diperbarui dengan hulu menggunakan GitHub web UI, namun hal ini akan sully anda melakukan sejarah. Tongkat untuk perintah line alih - it's mudah.
Berikut ini adalah GitHub's dokumen resmi di Sinkronisasi garpu:
Sinkronisasi garpu
Setup
Sebelum anda dapat melakukan sinkronisasi, anda perlu menambahkan sebuah remote yang menunjuk ke hulu repositori. Anda mungkin telah melakukan hal ini ketika anda awalnya bercabang.
Tip: Sinkronisasi garpu anda hanya update salinan lokal anda dari repositori; tidak memperbarui repositori di GitHub.
$ git remote -v
Daftar saat ini remote
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
$ git remote add hulu https://github.com/otheruser/repo.git
Set remote baru
$ git remote -v
Memverifikasi remote baru
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
upstream https://github.com/otheruser/repo.git (fetch)
upstream https://github.com/otheruser/repo.git (push)
Sinkronisasi
Ada dua langkah yang diperlukan untuk melakukan sinkronisasi repositori anda dengan hulu: pertama, anda harus mengambil dari jarak jauh, maka anda harus menggabungkan yang diinginkan cabang ke cabang lokal anda.
Mengambil
Mengambil dari repositori jauh akan membawa cabang-cabang dan masing-masing melakukan. Ini disimpan dalam repositori lokal anda di bawah kantor cabang khusus.
$ git fetch hulu
Ambil hulu remote's cabang
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
* [new branch] master -> upstream/master
Kami sekarang memiliki hulu's master cabang disimpan di sebuah cabang lokal, hulu/master
$ git branch -va
Daftar semua lokal dan remote-cabang pelacakan
* master a422352 My local commit
remotes/origin/HEAD -> origin/master
remotes/origin/master a422352 My local commit
remotes/upstream/master 5fdff0f Some upstream commit
Penggabungan
Sekarang bahwa kita telah diambil hulu repository, kita ingin menggabungkan perubahan ke cabang lokal. Ini akan membawa cabang yang menjadi sinkron dengan hulu, tanpa kehilangan perubahan lokal.
$ git checkout master
Check out kami lokal master cabang
Switched to branch 'master'
$ git merge hulu/master
Gabung hulu's master ke kita sendiri
Updating a422352..5fdff0f
Fast-forward
README | 9 -------
README.md | 7 ++++++
2 files changed, 7 insertions(+), 9 deletions(-)
delete mode 100644 README
create mode 100644 README.md
Jika cabang lokal anda didn't memiliki unik komit, git akan melakukan "cepat maju":
$ git merge hulu/master Memperbarui 34e91da..16c56ad Cepat-maju README.md| 5 +++-- 1 file berubah, 3 sisipan(+), 2 penghapusan(-)
Tip: Jika anda ingin memperbarui repositori di GitHub, ikuti petunjuk di sini
Banyak jawaban yang akhirnya menggerakkan garpu satu komit ke depan dari repositori utama. Jawaban ini merangkum langkah-langkah yang ditemukan di sini yang akan pindahkan garpu anda untuk commit sama seperti orang tua.
git checkout master
git remote add hulu <repo-lokasi>
git fetch hulu
git rebase hulu/master
git status
git push origin master
Untuk informasi lebih lanjut tentang perintah ini, lihat langkah 3.
Sejak November 2013 telah resmi permintaan fitur terbuka dengan GitHub untuk meminta mereka untuk menambahkan yang sangat sederhana dan intuitif metode untuk menjaga lokal garpu di sync dengan hulu:
https://github.com/isaacs/github/issues/121
Catatan: Karena permintaan fitur ini tidak resmi hal ini juga dianjurkan untuk menghubungi [email protected]
untuk menambahkan dukungan untuk fitur seperti ini yang akan dilaksanakan. Resmi permintaan fitur di atas bisa digunakan sebagai bukti besarnya minat ini diimplementasikan.
Kata pengantar: garpu Anda adalah "asal" dan repositori anda bercabang dari adalah "hulu".
Let's asumsikan bahwa anda kloning sudah garpu anda ke komputer anda dengan perintah seperti ini:
git clone [email protected]:your_name/project_name.git
cd project_name
Jika yang diberikan maka anda perlu untuk melanjutkan dalam urutan ini:
git remote add hulu [email protected]:original_author/project_name.git
git fetch hulu
git checkout master
git simpanan
git merge hulu/master
git commit-am "Gabungan dari hulu"
git push
git simpanan pop
GitHub juga menyediakan petunjuk untuk topik ini: Sinkronisasi garpu
Jika, seperti saya, anda tidak pernah melakukan apa-apa langsung ke master, yang anda harus benar-benar, anda dapat melakukan berikut ini.
Dari lokal clone dari garpu anda, membuat anda jauh upstream. Anda hanya perlu melakukannya sekali:
git remote add upstream https://github.com/whoever/whatever.git
Kemudian setiap kali anda ingin untuk mengejar ketinggalan dengan hulu repositori cabang master, anda harus:
git checkout master
git pull upstream master
Dengan asumsi anda tidak pernah melakukan apa-apa pada master diri sendiri anda harus sudah dilakukan. Sekarang anda dapat mendorong anda master lokal untuk anda asal remote GitHub garpu. Anda juga bisa rebase pengembangan cabang pada anda sekarang up-to-date master lokal.
Lalu awal hulu setup dan master checkout, semua yang perlu anda lakukan adalah menjalankan perintah berikut untuk melakukan sinkronisasi master dengan hulu: git pull hulu master.
Pada tanggal ini menjawab, GitHub telah tidak (atau harus saya katakan lagi?]1) fitur ini dalam antarmuka web. Namun, anda dapat meminta [email protected]
untuk menambahkan suara anda untuk itu.
Sementara itu, GitHub pengguna bardiharborow telah menciptakan sebuah alat untuk melakukan hal ini: https://upriver.github.io/
Sumber di sini: https://github.com/upriver/upriver.github.io
Jika anda menggunakan GitHub for Windows maka sekarang mereka memiliki satu-klik fitur untuk memperbarui forks:
Sebenarnya, itu adalah mungkin untuk membuat cabang di fork anda setiap melakukan hulu di browser:
https://github.com/<repo>/melakukan/<hash>
, di mana repo adalah garpu anda, dan hash penuh hash komit yang dapat anda temukan di hulu antarmuka web. Sebagai contoh, saya dapat membuka https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 yang poin untuk linux
guru
sebagai waktu penulisan.Anda kemudian dapat mengambil bahwa cabang lokal anda clone, dan anda tidak't harus mendorong semua data kembali ke GitHub ketika anda mendorong suntingan di atas yang dilakukannya. Atau gunakan antarmuka web untuk mengubah sesuatu di cabang itu.
Cara kerjanya (itu adalah menebak, I don't tahu bagaimana sebenarnya GitHub tidak): garpu berbagi objek penyimpanan dan penggunaan nama untuk memisahkan pengguna' referensi. Sehingga anda dapat mengakses semua komit melalui garpu anda, bahkan jika mereka tidak ada pada saat forking.
Ikuti langkah-langkah di bawah ini. Aku mencoba mereka dan itu membantu saya.
Checkout ke cabang anda
Sintaks: git branch yourDevelopmentBranch Contoh: git checkout master
Tarik sumber repositori cabang untuk mendapatkan kode terbaru
Sintaks: git pull https://github.com/tastejs/awesome-app-ideas master Contoh: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME
Sebagai pelengkap untuk jawaban ini, saya sedang mencari cara untuk memperbarui semua remote cabang dari saya kloning repo (asal) dari hulu cabang-cabang dalam satu pergi. Ini adalah bagaimana saya melakukannya.
Ini mengasumsikan anda telah mengonfigurasi hulu remote menunjuk pada sumber repositori (mana asal itu bercabang dari) dan telah disinkronisasikan dengan git fetch hulu
.
Kemudian jalankan:
for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done
Bagian pertama dari perintah ini menampilkan semua kepala di hulu remote repo dan menghilangkan SHA-1 yang diikuti oleh ref/kepala/
nama cabang awalan.
Kemudian untuk masing-masing cabang ini, mendorong salinan lokal hulu remote tracking cabang (ref/remote/hulu/<cabang>
di samping lokal) langsung ke cabang terpencil di asal (ref/kepala/<cabang>
pada sisi remote).
Salah satu cabang perintah sinkronisasi mungkin gagal untuk salah satu dari dua alasan: baik hulu cabang telah ditulis ulang, atau anda telah mendorong berkomitmen pada cabang yang ke garpu. Dalam kasus pertama di mana anda ingin't melakukan apa-apa untuk cabang di garpu anda adalah aman untuk mendorong paksa (Tambahkan -f beralih; yaitu git push-f
pada command di atas). Di sisi lain hal ini adalah normal sebagai garpu cabang telah menyimpang dan anda dapat't mengharapkan sinkronisasi perintah untuk bekerja sampai anda melakukan telah bergabung kembali ke hulu.
Android Studio sekarang telah belajar untuk bekerja dengan GitHub garpu repositori (anda don't bahkan harus menambahkan "hulu" remote repository dengan perintah konsol).
Buka menu VCS → Git
Dan memperhatikan dua terakhir popup menu item:
Rebase GitHub saya garpu
Membuat Permintaan Tarik
Cobalah mereka. Saya gunakan pertama untuk menyinkronkan saya repositori lokal. Lagi pula cabang-cabang dari induk remote repository ("hulu") akan dapat diakses di Android Studio setelah anda klik "Rebase GitHub saya garpu", dan anda akan dapat beroperasi dengan mereka dengan mudah.
(Saya menggunakan Android Studio 3.0 dengan "integrasi Git" dan "GitHub" plugin.)
Bila anda memiliki kloning anda bercabang repositori, pergi ke path direktori dimana clone anda berada dan beberapa baris di Git Bash Terminal.
$ cd project-name
$ git remote add upstream https://github.com/user-name/project-name.git
# Adding the upstream -> the main repo with which you wanna sync
$ git remote -v # you will see the upstream here
$ git checkout master # see if you are already on master branch
$ git fetch upstream
Dan anda baik untuk pergi. Semua diperbarui perubahan dalam repositori utama akan didorong ke garpu repositori.
"fetch" perintah ini sangat diperlukan untuk tetap up-to-date di sebuah proyek: hanya ketika melakukan "git fetch" anda akan diberitahu tentang perubahan rekan anda didorong ke remote server.
Anda masih bisa berkunjung di sini untuk pertanyaan lebih lanjut
Itu tergantung pada ukuran dari repositori anda dan bagaimana anda bercabang itu.
Jika itu's cukup besar repositori anda mungkin ingin mengelolanya dengan cara khusus (misalnya drop sejarah). Pada dasarnya, anda bisa mendapatkan perbedaan antara saat ini dan hulu versi, komit mereka dan kemudian ceri memilih kembali ke master.
Cobalah membaca ini. Ia menjelaskan bagaimana untuk menangani besar Git repositori dan cara hulu mereka dengan perubahan terbaru.
Ada dua hal utama pada menjaga bercabang repositori selalu update untuk kebaikan.
1. Membuat cabang-cabang dari garpu master dan melakukan perubahan di sana.
Jadi, ketika anda Tarik Permintaan diterima maka anda dapat dengan aman menghapus cabang sebagai kontribusi kode akan kemudian hidup di dalam anda menguasai anda bercabang repositori ketika anda memperbarui itu dengan hulu. Dengan ini master anda akan selalu dalam kondisi yang bersih untuk membuat cabang baru untuk melakukan perubahan lain.
2. Membuat jadwal kerja untuk fork master untuk melakukan pembaruan secara otomatis.
Hal ini dapat dilakukan dengan cron. Berikut ini adalah contoh kode jika anda melakukannya di linux.
$ crontab -e
menempatkan kode ini pada crontab file
untuk melaksanakan pekerjaan di per jam.
0 * * * * sh ~/cron.sh
kemudian menciptakan cron.sh
script file dan file git interaksi dengan ssh-agent dan/atau berharap seperti di bawah ini
#!/bin/sh
WORKDIR=/path/to/your/dir
REPOSITORY=<name of your repo>
MASTER="[email protected]:<username>/$REPOSITORY.git"
[email protected]:<upstream>/<name of the repo>.git
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
echo "all the same, do nothing"
else
echo "update exist, do rebase!"
git reset --hard upstream/master
git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`
Periksa bercabang repositori. Dari waktu ke waktu akan selalu menampilkan notifikasi ini:
cabang Ini bahkan dengan
<hulu>
:master.