Bagaimana saya bisa menemukan lokasi asal / master di git, dan bagaimana cara mengubahnya?


227

Saya seorang pemula Git. Saya baru-baru ini memindahkan proyek Rails dari Subversion ke Git. Saya mengikuti tutorial di sini: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

Saya juga menggunakan unfuddle.com untuk menyimpan kode saya. Saya membuat perubahan pada laptop Mac saya di kereta ke / dari kantor dan kemudian mendorong mereka untuk mengurai ketika saya memiliki koneksi jaringan menggunakan perintah berikut:

git push unfuddle master

Saya menggunakan Capistrano untuk penyebaran dan menarik kode dari repositori yang tidak diuraikan menggunakan cabang utama.

Akhir-akhir ini saya perhatikan pesan berikut ketika saya menjalankan "git status" di laptop saya:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

Dan saya bingung mengapa. Saya pikir laptop saya adalah asalnya ... tapi tidak tahu apakah fakta bahwa saya awalnya menarik dari Subversion atau mendorong Unfuddle adalah apa yang menyebabkan pesan tersebut muncul. Bagaimana bisa saya:

  1. Cari tahu di mana menurut Git 'asal / tuan'?
  2. Jika ada di tempat lain, bagaimana cara mengubah laptop saya menjadi 'asal / master'?
  3. Dapatkan pesan ini untuk pergi. Itu membuatku berpikir Git tidak senang dengan sesuatu.

Mac saya menjalankan Git versi 1.6.0.1.


Ketika saya menjalankan git remote show originseperti yang disarankan oleh dbr, saya mendapatkan yang berikut:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

Ketika saya menjalankan git remote -vseperti yang disarankan oleh Aristoteles Pagaltzis, saya mendapatkan yang berikut:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    git@spilth.unfuddle.com:spilth/geekfor.git

Sekarang, yang menarik, saya sedang mengerjakan proyek saya di geekfordirektori tetapi dikatakan asal saya adalah mesin lokal saya di gfdirektori. Saya percaya gfadalah direktori sementara yang saya gunakan ketika mengonversi proyek saya dari Subversion ke Git dan mungkin dari mana saya mendorongnya untuk menyelesaikannya. Kemudian saya percaya saya telah memeriksa salinan baru dari tidak beres ke geekfordirektori.

Jadi sepertinya saya harus mengikuti saran dbr dan melakukan:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git

Jawaban:


202

1. Cari tahu di mana Git berpikir 'asal / master' menggunakan git-remote

git remote show origin

..yang akan mengembalikan sesuatu seperti ..

* remote origin
  URL: me@remote.example.com:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Remote pada dasarnya adalah tautan ke repositori jarak jauh. Saat kamu melakukan..

git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle

..git akan mendorong perubahan ke alamat yang Anda tambahkan. Ini seperti bookmark, untuk repositori jarak jauh.

Ketika Anda menjalankan git status, itu memeriksa apakah remote hilang komit (dibandingkan dengan repositori lokal Anda), dan jika demikian, dengan berapa komit. Jika Anda mendorong semua perubahan Anda ke "asal", keduanya akan disinkronkan, sehingga Anda tidak akan menerima pesan itu.

2. Jika ada di tempat lain, bagaimana cara mengubah laptop saya menjadi 'asal / master'?

Tidak ada gunanya melakukan ini. Katakanlah "asal" diubah namanya menjadi "laptop" - Anda tidak ingin melakukannyagit push laptop dari laptop Anda.

Jika Anda ingin menghapus remote asal, Anda lakukan ..

git remote rm origin

Ini tidak akan menghapus apa pun (dalam hal file-konten / revisi-sejarah). Ini akan menghentikan pesan "cabang Anda di depan oleh ..", karena tidak akan lagi membandingkan repositori Anda dengan remote (karena sudah hilang!)

Satu hal yang perlu diingat adalah bahwa tidak ada yang spesial tentang originitu, itu hanya nama default yang digunakan git.

Git memang digunakan originsecara default ketika Anda melakukan hal-hal seperti git pushatau git pull. Jadi, jika Anda memiliki remote yang sering Anda gunakan (Unfuddle, dalam kasus Anda), saya sarankan menambahkan unfuddle sebagai "origin":

git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

atau lakukan hal di atas dalam satu perintah menggunakan set-url:

git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

Maka Anda cukup melakukan git pushatau git pullmemperbarui, alih-alihgit push unfuddle master


1
Dia menulis bahwa dia mendorong ke originrepositori (meskipun dia tidak tahu bagaimana cara kerjanya dalam istilah git) - menghapus remote tidak akan menjadi hal yang berguna untuk dilakukan untuknya.
Aristoteles Pagaltzis

10
Saya tidak mengerti mengapa orang menulis ulang pertanyaan. Itu mengubah makna pertanyaan, membuat jawaban yang ada menjadi tidak masuk akal, dan tidak membuat orang lain tahu bahwa penanya memerlukan informasi lebih banyak berdasarkan fakta bahwa pertanyaan mereka mungkin sedikit 'salah'.
stu

9
Menghapus asal remote persis apa yang saya butuhkan karena itu menunjuk ke repositori lokal yang tidak ada lagi, bukan repositori yang tidak terpecahkan.
Brian Kelly

3
stu: Menulis ulang adalah hal yang baik! Jika mereka tidak mengatakannya dengan jelas sejak awal, tidak ada gunanya mendapatkan jawaban yang tidak menyelesaikan masalah yang sebenarnya.
dbr

4
Tetapi jauh lebih mudah untuk marah dan pahit. :-) Tapi saya mengerti maksud Anda.
stu

286

Saya sampai pada pertanyaan ini mencari penjelasan tentang apa arti pesan "cabang Anda di depan ...", dalam skema umum git. Tidak ada jawaban untuk itu di sini, tetapi karena pertanyaan ini saat ini muncul di bagian atas Google ketika Anda mencari frasa "Cabang Anda di depan 'asal / master'", dan sejak itu saya sudah tahu apa arti pesan itu sebenarnya , Saya pikir saya akan mengirim info di sini.

Jadi, sebagai pemula git, saya bisa melihat bahwa jawaban yang saya butuhkan adalah jawaban yang jelas-jelas baru. Secara khusus, apa arti frasa "cabang Anda di depan oleh ..." adalah bahwa ada file yang Anda tambahkan dan komit ke repositori lokal Anda, tetapi tidak pernah mendorong ke tempat asalnya. Maksud pesan ini semakin dikaburkan oleh fakta bahwa "git diff", setidaknya bagi saya, tidak menunjukkan perbedaan. Baru setelah saya menjalankan "git diff origin / master" saya diberi tahu bahwa ada perbedaan antara repositori lokal saya, dan master jarak jauh.

Jadi, untuk menjadi jelas:


"cabang Anda ada di depan dengan ..." => Anda harus mendorong ke master jarak jauh. Jalankan "git diff origin / master" untuk melihat perbedaan antara repositori lokal Anda dan repositori master jarak jauh.


Semoga ini bisa membantu pemula lainnya.

(Juga, saya mengenali bahwa ada seluk-beluk konfigurasi yang dapat membatalkan sebagian solusi ini, seperti fakta bahwa master mungkin sebenarnya bukan "jarak jauh", dan bahwa "asal" adalah nama yang dapat dikonfigurasi ulang yang digunakan oleh konvensi, dll. tidak peduli tentang hal semacam itu. Kami ingin jawaban yang sederhana dan langsung. Kami dapat membaca tentang seluk-beluknya nanti, setelah kami menyelesaikan masalah yang mendesak.)

Pangeran


2
@ Elar Bukankah git diff --cached origin/masterinstruksi yang lebih baik di sini karena menyatakan apa yang akan hasil dari dorongan berikutnya Perintah yang disorot yang Anda miliki di atas juga menunjukkan file yang tidak dikomit & tidak dipentaskan (saya pikir, saya juga seorang pemula git)
nhed

48
Mungkin juga Anda perlu menjalankan git fetchjika Anda mendapatkan kesalahan ini setelah a git pull remote branch. Referensi Anda mungkin kedaluwarsa. git fetchmemperbaikinya.
bryan kennedy

Apakah origin/masterbagian itu berarti mastercabang dalam originrepo?
Rakib

1
Perhatikan bahwa deskripsi ini tidak lengkap. Saat ini saya mengalami # On branch master # Your branch is ahead of 'origin/master' by 3 commits. Tapi git diff asal / master tidak menunjukkan apa-apa, (dan opsi --cached tidak mengubah ini). Dan, git fetch tidak mengubah ini, git pull tidak mengubah ini, git reset --hard tidak mengubah ini. Untuk mengubah ini, saya perlu: git reset --hard origin / master Dan saya memilih rute itu karena orang lain bekerja dengan saya dalam repositori ini dan saya tidak ingin membatalkan pengujian mereka, dan karena saya tidak bisa mengetahui apa yang dilakukan. adalah.
rdm

1
Saya juga mendapatkan pesan ini ketika saya harus menarik dari daripada mendorong ke asal / master. misalnya dari cabang lain jika saya git checkout mastermendapatkan pesan, yang berarti saya harus git pull origin mastersebelum bekerja. tapi saya merasa sangat membingungkan karena kata-kata dari pesan tersebut menunjukkan yang sebaliknya
Anentropic

38

Saya punya masalah yang mirip dengan ini di mana direktori kerja saya ahead of origin by X commitstetapi git pullhasilnya Everything up-to-date. Saya berhasil memperbaikinya dengan mengikuti saran ini . Saya memposting ini di sini kalau-kalau itu membantu orang lain dengan masalah yang sama.

Perbaikan dasar adalah sebagai berikut:

$ git push {remote} {localbranch}:{remotebranch}

Di mana kata-kata dalam kurung harus diganti dengan nama jarak jauh Anda, nama cabang lokal Anda dan nama cabang jarak jauh Anda. misalnya

$ git push origin master:master

1
Terima kasih, itu berhasil untuk saya. git difftidak menunjukkan apa-apa, dan setelah melakukan apa yang Anda gambarkan saya tidak lagi mendapatkan pesan yang membingungkan dan menjengkelkan ini.
LaundroMat

1
Membutuhkan lebih banyak upvotes :). Jawaban yang lebih tinggi semua "tidak berpengaruh" bagi saya (yaitu "git fetch" - tidak melakukan apa-apa ... periksa "git remote show origin" - tidak ada yang salah, tidak ada yang perlu diubah)
Adam


10

Saya pikir laptop saya adalah asalnya…

Itu agak tidak masuk akal: originmerujuk ke repositori jarak jauh default - yang biasanya Anda ambil / tarik perubahannya dari orang lain.

Bagaimana bisa saya:

  1. git remote -vakan menunjukkan kepada Anda apa yang originada; origin/masteradalah "bookmark" Anda untuk keadaan terakhir yang diketahui dari mastercabang originrepositori, dan milik Anda sendiri masteradalah cabang pelacakan untuk origin/master. Ini semua sebagaimana mestinya .

  2. Kamu tidak. Setidaknya tidak masuk akal untuk repositori menjadi repositori jarak jauh default untuk dirinya sendiri.

  3. Bukan itu. Ini hanya memberi tahu Anda bahwa Anda telah membuat begitu-dan-begitu banyak komit secara lokal yang tidak ada di repositori jarak jauh (sesuai dengan kondisi repositori terakhir yang diketahui).


1
Saya berasumsi laptop saya adalah asalnya karena di situlah saya pertama kali membuat repositori (dari mana asalnya).
Brian Kelly

1
Sebaliknya, sangat masuk akal bagi saya untuk originmenunjuk laptop secara lokal, karena offline atau berpindah jaringan adalah kasus yang sangat umum untuk perangkat portabel seperti laptop. Dengan cara ini Anda dapat menggunakan git pushdan git pullkapan saja, tidak perlu dipikirkan jika Anda terhubung ke jaringan yang tepat saat ini. Lokal ini origindapat disinkronkan dengan remote nyata secara otomatis ketika tautan jaringan tersedia, tergantung pada status roaming saat ini. Bagian yang bermasalah adalah kapan harus menjalankan sinkronisasi mana, dibandingkan dengan bagian GIT yang cukup mudah.
Tino

2
Menunjuk originpada lain repositori pada laptop Anda masuk akal, yakin. Namun, menunjuk originrepositori itu sendiri tidak akan: tidak ada bedanya apakah Anda menjalankan git pushatau git pull, karena repositori selalu benar-benar sinkron dengan repositori itu sendiri. Itu salah, agak tautologis.
Aristoteles Pagaltzis

3

[Solusi]

$ git push origin

^ ini menyelesaikannya untuk saya. Apa yang dilakukannya, itu menyinkronkan master saya (di laptop) dengan "asal" yang ada di server jauh.


1

Saya berjuang dengan masalah ini dan tidak ada jawaban sebelumnya yang menangani pertanyaan seperti yang saya lihat. Saya telah menanggalkan masalah kembali ke dasarnya untuk melihat apakah saya dapat menjelaskan masalah saya.

Saya membuat repositori baru (rep1), memasukkan satu file di dalamnya dan melakukan itu.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Saya membuat klon dari rep1 dan menyebutnya rep2. Saya melihat ke dalam rep2 dan melihat file tersebut benar.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

Dalam rep1 saya membuat satu perubahan pada file dan melakukan itu. Kemudian di rep1 saya membuat remote untuk menunjuk ke rep2 dan mendorong perubahan.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Sekarang ketika saya masuk ke rep2 dan melakukan 'status git' saya diberitahu bahwa saya berada di depan.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

README di rep2 adalah seperti aslinya, sebelum komit kedua. Satu-satunya modifikasi yang telah saya lakukan adalah rep1 dan yang ingin saya lakukan hanyalah mendorongnya ke rep2. Apa yang tidak saya pegang?


1
Dua hal: cek "asal / master" rep2 tidak benar-benar melihat rep1. Jika Anda melakukan 'git pull' di rep2, ia akan melihat bahwa mereka berada dalam kondisi yang sama dan berhenti mengeluh. Untuk benar-benar melihat perubahan dari push dalam copy pekerjaan, Anda perlu melakukan 'git checkout' - push tidak pernah menyentuh copy pekerjaan desto repo.
Walter Mundt

Saya pikir mungkin itu yang terjadi tetapi saya mendapatkan "git checkout M README Cabang Anda di depan 'asal / master' dengan 1 komit." Tapi copy pekerjaan saya sebenarnya di belakang oleh 1 commit, bukan di depan.
Steve Hindmarch

1

Menunggu Anda untuk "mendorong". Mencoba:

$ git push


1

Saya memiliki masalah ini baru-baru ini dan saya pikir itu karena saya telah menghapus beberapa file yang tidak saya butuhkan lagi. Masalahnya adalah bahwa git tidak tahu bahwa file telah dihapus dan ia melihat bahwa server masih memilikinya. (server = asal)

Jadi saya berlari

git rm $(git ls-files --deleted)

Dan kemudian jalankan komit dan dorong.

Itu memecahkan masalah.


1
Ini hanya berfungsi jika pesan komit mengatakan hapus - <file name>
looneydoodle

1

Saya seorang pemula git juga. Saya memiliki masalah yang sama dengan pesan 'cabang Anda di depan / master oleh N melakukan'. Melakukan 'git diff origin / master' yang disarankan memang menunjukkan beberapa perbedaan yang tidak ingin saya pertahankan. Jadi ...

Karena klon git saya adalah untuk hosting, dan saya ingin salinan persis dari master repo, dan tidak peduli untuk menyimpan perubahan lokal, saya memutuskan untuk menyimpan seluruh repo saya, dan membuat yang baru:

(di mesin hosting)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

Untuk kemudahan, saya digunakan untuk membuat perubahan pada klon di mesin hosting saya. Tidak lagi. Saya akan melakukan perubahan pada master, git melakukan commit di sana, dan melakukan git pull. Mudah-mudahan, ini harus menjaga klon git saya di mesin hosting dalam sinkronisasi lengkap.

/ Nara


0

Saya bertanya-tanya hal yang sama tentang repo saya. Dalam kasus saya, saya memiliki remote lama yang saya tidak mendorong lagi sehingga saya perlu menghapusnya.

Dapatkan daftar remote:

git remote

Hapus yang tidak Anda butuhkan

git remote rm {insert remote to remove}

0

Dimungkinkan untuk mereset ke komit tertentu sebelum komit Anda sendiri dilakukan.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Gunakan git loguntuk menemukan komit yang merupakan komitmen yang Anda miliki sebelum perubahan lokal terjadi.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Catat komit lokal dan atur ulang langsung ke komit sebelumnya:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

Saya memiliki masalah "Cabang Anda di depan 'asal / master' oleh nn commit." ketika saya mendorong ke repositori jarak jauh dengan:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

Ketika saya menemukan bahwa alamat jarak jauh saya ada di file .git / FETCH_HEAD dan digunakan:

git push

masalahnya hilang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.