Làm cách nào để tìm vị trí xuất xứ / chủ trong git và làm cách nào để thay đổi?


227

Tôi là người mới chơi Git. Gần đây tôi đã chuyển một dự án Rails từ Subversion sang Git. Tôi đã làm theo hướng dẫn ở đây: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-reposeective-to-a-git-reposeective/

Tôi cũng đang sử dụng unluddle.com để lưu trữ mã của mình. Tôi thực hiện các thay đổi trên máy tính xách tay Mac của mình trên tàu đến / đi làm và sau đó đẩy chúng ra để giải quyết khi tôi có kết nối mạng bằng lệnh sau:

git push unfuddle master

Tôi sử dụng Capistrano để triển khai và lấy mã từ kho lưu trữ không sử dụng bằng nhánh chính.

Gần đây tôi đã nhận thấy thông báo sau khi tôi chạy "trạng thái git" trên máy tính xách tay của mình:

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

Và tôi bối rối không biết tại sao. Tôi nghĩ máy tính xách tay của tôi là nguồn gốc ... nhưng không biết liệu ban đầu tôi rút từ Subversion hay đẩy sang Unfuddle có phải là nguyên nhân khiến thông báo hiển thị hay không. Làm thế nào tôi có thể:

  1. Tìm xem Git nghĩ 'nguồn gốc / chủ nhân' ở đâu?
  2. Nếu nó ở một nơi nào khác, làm cách nào để biến máy tính xách tay của tôi thành 'bản gốc / bản gốc'?
  3. Nhận tin nhắn này để đi. Nó khiến tôi nghĩ Git không hài lòng về điều gì đó.

Mac của tôi đang chạy phiên bản Git 1.6.0.1.


Khi tôi chạy git remote show origintheo đề xuất của dbr, tôi nhận được như sau:

~/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

Khi tôi chạy git remote -vtheo đề xuất của Aristotle Pagaltzis, tôi nhận được như sau:

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

Bây giờ, thật thú vị, tôi đang làm việc với dự án của mình trong geekforthư mục nhưng nó nói nguồn gốc của tôi là máy cục bộ của tôi trong gfthư mục. Tôi tin rằng đó gflà thư mục tạm thời mà tôi đã sử dụng khi chuyển đổi dự án của mình từ Subversion sang Git và có lẽ là nơi tôi đã đẩy sang giải quyết. Sau đó, tôi tin rằng tôi đã kiểm tra một bản sao mới từ unuddle vào geekforthư mục.

Vì vậy, có vẻ như tôi nên làm theo lời khuyên của dbr và làm:

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

Câu trả lời:


202

1. Tìm hiểu nơi Git nghĩ rằng 'origin / master' đang sử dụng git-remote

git remote show origin

.. những gì sẽ trả lại một cái gì đó như ..

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

Một điều khiển từ xa về cơ bản là một liên kết đến một kho lưu trữ từ xa. Khi bạn làm ..

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

..git sẽ đẩy các thay đổi đến địa chỉ mà bạn đã thêm. Nó giống như một dấu trang, cho các kho lưu trữ từ xa.

Khi bạn chạy git status, nó sẽ kiểm tra xem điều khiển từ xa có thiếu các xác nhận không (so với kho lưu trữ cục bộ của bạn) và nếu có thì bao nhiêu lần xác nhận. Nếu bạn đẩy tất cả các thay đổi của mình sang "nguồn gốc", cả hai sẽ được đồng bộ hóa, vì vậy bạn sẽ không nhận được thông báo đó.

2. Nếu nó ở một nơi nào khác, làm cách nào để biến máy tính xách tay của tôi thành 'bản gốc / bản gốc'?

Không có điểm nào trong việc này. Nói "nguồn gốc" được đổi tên thành "máy tính xách tay" - bạn không bao giờ muốn làm git push laptoptừ máy tính xách tay của mình.

Nếu bạn muốn xóa nguồn gốc từ xa, bạn làm ..

git remote rm origin

Điều này sẽ không xóa bất cứ điều gì (về nội dung tập tin / sửa đổi-lịch sử). Điều này sẽ ngăn thông báo "chi nhánh của bạn đi trước ..", vì nó sẽ không còn so sánh kho lưu trữ của bạn với điều khiển từ xa nữa (vì nó đã biến mất!)

Một điều cần nhớ là không có gì đặc biệt origin, đó chỉ là một tên mặc định mà git sử dụng.

Git sử dụng origintheo mặc định khi bạn làm những việc như git pushhoặc git pull. Vì vậy, nếu bạn có một điều khiển từ xa, bạn sử dụng rất nhiều (Unfuddle, trong trường hợp của bạn), tôi khuyên bạn nên thêm unuddle là "origin":

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

hoặc thực hiện các thao tác trên trong một lệnh bằng cách sử dụng set-url:

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

Sau đó, bạn có thể chỉ cần làm git pushhoặc git pullcập nhật, thay vìgit push unfuddle master


1
Anh ta viết rằng anh ta đẩy vào originkho lưu trữ (mặc dù anh ta không biết làm thế nào nó hoạt động theo thuật ngữ git) - loại bỏ điều khiển từ xa sẽ không phải là một điều hữu ích để làm cho anh ta.
Aristotle Pagaltzis

10
Tôi không hiểu tại sao mọi người lại đặt câu hỏi. Nó thay đổi ý nghĩa của câu hỏi, nó làm cho câu trả lời hiện tại không có ý nghĩa và nó không cho người khác biết rằng người hỏi câu hỏi cần thêm thông tin dựa trên thực tế rằng câu hỏi của họ có thể hơi "không chính xác".
stu

9
Xóa nguồn gốc từ xa là chính xác những gì tôi cần bởi vì nó đang trỏ đến một kho lưu trữ cục bộ không còn tồn tại nữa, không phải là kho lưu trữ không gắn kết.
Brian Kelly

3
stu: Viết lại là một điều tốt! Nếu họ không nói rõ ràng ngay từ đầu, sẽ không có câu trả lời nào không giải quyết được vấn đề thực sự.
dbr

4
Nhưng nó dễ dàng hơn nhiều để tức giận và cay đắng. :-) Nhưng tôi thấy quan điểm của bạn.
stu

286

Tôi đến câu hỏi này để tìm lời giải thích về thông điệp "chi nhánh của bạn đi trước ..." nghĩa là gì, trong sơ đồ chung của git. Không có câu trả lời cho điều đó ở đây, nhưng vì câu hỏi này hiện đang xuất hiện ở đầu Google khi bạn tìm kiếm cụm từ "Chi nhánh của bạn đi trước 'origin / master'", và từ đó tôi đã hiểu được thông điệp thực sự có nghĩa là gì , Tôi nghĩ rằng tôi sẽ đăng thông tin ở đây.

Vì vậy, là một người mới chơi git, tôi có thể thấy rằng câu trả lời tôi cần là một câu trả lời rõ ràng cho người mới. Cụ thể, cụm từ "chi nhánh của bạn đi trước ..." có nghĩa là có những tệp bạn đã thêm và cam kết vào kho lưu trữ cục bộ của mình, nhưng chưa bao giờ được đẩy về nguồn gốc. Mục đích của tin nhắn này càng bị xáo trộn bởi thực tế là "git diff", ít nhất là đối với tôi, cho thấy không có sự khác biệt. Mãi đến khi tôi chạy "git diff origin / master", tôi mới được thông báo rằng có sự khác biệt giữa kho lưu trữ cục bộ của tôi và chủ từ xa.

Vì vậy, để rõ ràng:


"Chi nhánh của bạn đi trước ..." => Bạn cần phải đẩy đến chủ từ xa. Chạy "git diff origin / master" để xem sự khác biệt giữa kho lưu trữ cục bộ của bạn và kho lưu trữ chính từ xa.


Hy vọng điều này sẽ giúp những người mới khác.

(Ngoài ra, tôi nhận ra rằng có những sự tinh tế về cấu hình có thể làm mất hiệu lực một phần giải pháp này, chẳng hạn như chủ nhân có thể không thực sự là "từ xa" và "nguồn gốc" là một tên có thể cấu hình lại được sử dụng bởi quy ước, v.v. không quan tâm đến vấn đề đó. Chúng tôi muốn những câu trả lời đơn giản, đơn giản. Chúng tôi có thể đọc về sự tinh tế sau này, một khi chúng tôi đã giải quyết được vấn đề cấp bách.)

Bá tước


2
@Earl Sẽ không git diff --cached origin/masterđược hướng dẫn tốt hơn ở đây vì nó nói kết quả của lần đẩy tiếp theo là gì? Lệnh được tô sáng mà bạn có ở trên cũng hiển thị các tệp không được cam kết & chưa được xử lý (tôi nghĩ, tôi cũng là một người mới chơi git)
nhed

48
Cũng có thể bạn cần chạy git fetchnếu bạn gặp lỗi này sau một git pull remote branch. Ref của bạn có thể đã hết hạn. git fetchsửa lỗi đó
bryan kennedy

hiện origin/masterphần nghĩa masterchi nhánh tại originrepo?
Rakib

1
Lưu ý rằng mô tả này là không đầy đủ. Tôi hiện đang trải nghiệm # On branch master # Your branch is ahead of 'origin/master' by 3 commits. Nhưng git diff origin / master không hiển thị gì cả (và tùy chọn --cached không thay đổi điều này). Và, git fetch không thay đổi điều này, git pull không thay đổi điều này, git reset - không thay đổi điều này. Để thay đổi điều này, tôi cần: git reset --hard origin / master Và tôi chọn tuyến đường đó vì những người khác đang làm việc với tôi trong kho lưu trữ này và tôi không muốn làm mất hiệu lực thử nghiệm của họ và vì tôi không thể tìm ra những cam kết này Chúng tôi.
RDM

1
Tôi cũng nhận được thông báo này khi tôi cần kéo từ thay vì đẩy sang nguồn gốc / chủ. ví dụ từ một chi nhánh khác nếu tôi git checkout masternhận được tin nhắn, điều đó có nghĩa là tôi nên git pull origin masterlàm việc trước khi làm việc. nhưng tôi thấy nó rất khó hiểu bởi vì từ ngữ của tin nhắn cho thấy điều ngược lại
Anentropic

38

Tôi đã có một vấn đề tương tự như nơi thư mục làm việc của tôi ahead of origin by X commitsnhưng git pullkết quả là Everything up-to-date. Tôi đã cố gắng khắc phục bằng cách làm theo lời khuyên này . Tôi đang đăng bài này lên đây trong trường hợp nó giúp người khác gặp vấn đề tương tự.

Cách khắc phục cơ bản như sau:

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

Trường hợp các từ trong ngoặc nên được thay thế bằng tên từ xa, tên chi nhánh địa phương và tên chi nhánh từ xa của bạn. ví dụ

$ git push origin master:master

1
Cảm ơn, điều đó đã làm cho tôi. git diffđã không hiển thị bất cứ điều gì, và sau khi làm những gì bạn mô tả, tôi không còn nhận được tin nhắn khó hiểu và gây phiền nhiễu này nữa.
LaundroMat 17/03/2016

1
Cần nhiều upvote hơn :). Các câu trả lời được bình chọn cao hơn đều là "không có tác dụng" đối với tôi (tức là "git fetch" - không làm gì cả ... kiểm tra "git remote show origin" - không có gì sai, không cần thay đổi gì)
Adam


10

Tôi nghĩ máy tính xách tay của tôi là bản gốc

Đó là loại vô nghĩa: originđề cập đến kho lưu trữ từ xa mặc định - kho lưu trữ mà bạn thường tìm nạp / lấy các thay đổi của người khác từ đó.

Làm thế nào tôi có thể:

  1. git remote -vsẽ cho bạn thấy những gì originđang có; origin/masterlà “bookmark” của bạn cho các trạng thái cuối cùng được biết đến của masterchi nhánh của originkho lưu trữ, và của riêng bạn masterlà một chi nhánh theo dõi cho origin/master. Đây là tất cả như nó phải được .

  2. Bạn không. Ít nhất nó không có ý nghĩa đối với một kho lưu trữ là kho lưu trữ từ xa mặc định cho chính nó.

  3. Không phải vậy. Nó chỉ đơn thuần nói với bạn rằng bạn đã thực hiện rất nhiều cam kết cục bộ không có trong kho lưu trữ từ xa (theo trạng thái được biết đến cuối cùng của kho lưu trữ đó).


1
Tôi giả sử máy tính xách tay của tôi là nguồn gốc vì đó là nơi đầu tiên tôi tạo kho lưu trữ (nơi nó bắt nguồn).
Brian Kelly

1
Ngược lại, tôi hoàn toàn có ý nghĩa khi originchỉ vào máy tính xách tay cục bộ, vì ngoại tuyến hoặc chuyển đổi mạng là trường hợp rất phổ biến đối với các thiết bị di động như máy tính xách tay. Bằng cách này bạn có thể sử dụng git pushgit pullbất cứ lúc nào, không cần phải suy nghĩ nếu bạn hiện đang kết nối với đúng mạng. Địa phương này origincó thể được đồng bộ hóa với điều khiển từ xa thực sự tự động khi có sẵn một liên kết mạng, tùy thuộc vào trạng thái chuyển vùng hiện tại. Phần có vấn đề là khi nào chạy đồng bộ hóa, so với phần GIT đó là khá dễ dàng.
Tino

2
Chỉ originvào một kho lưu trữ khác trên máy tính xách tay của bạn có ý nghĩa hoàn hảo, chắc chắn. Chỉ các origincủa kho tại bản thân tuy nhiên không: nó sẽ làm cho có sự khác biệt nào cho dù bạn chạy git pushhay git pull, kể từ khi một kho lưu trữ phải lúc nào cũng chính xác đồng bộ với chính nó anyway. Đó là sai lầm, loại tautological.
Aristotle Pagaltzis

3

[ Giải pháp ]

$ git push origin

^ điều này đã giải quyết nó cho tôi. Những gì nó đã làm, nó đã đồng bộ hóa chủ của tôi (trên máy tính xách tay) với "nguồn gốc" trên máy chủ từ xa.


1

Tôi đang vật lộn với vấn đề này và không có câu trả lời nào trước đó giải quyết được câu hỏi như tôi thấy. Tôi đã loại bỏ vấn đề trở lại vấn đề cơ bản của nó để xem liệu tôi có thể làm cho vấn đề của mình rõ ràng hơn không.

Tôi tạo một kho lưu trữ mới (rep1), đặt một tệp vào đó và cam kết nó.

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

Tôi tạo một bản sao của rep1 và gọi nó là rep2. Tôi nhìn vào bên trong rep2 và thấy tập tin là chính xác.

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

Trong rep1 tôi thực hiện một thay đổi duy nhất cho tệp và cam kết nó. Sau đó, trong rep1 tôi tạo một điều khiển từ xa để trỏ đến rep2 và đẩy các thay đổi.

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

Bây giờ khi tôi vào rep2 và thực hiện 'trạng thái git', tôi được thông báo rằng tôi đi trước nguồn gốc.

# 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 trong rep2 giống như ban đầu, trước khi cam kết thứ hai. Các sửa đổi duy nhất tôi đã thực hiện là rep1 và tất cả những gì tôi muốn làm là đẩy chúng ra rep2. Tôi không nắm bắt được điều gì?


1
Hai điều: kiểm tra "nguồn gốc / chủ" của rep2 không thực sự nhìn vào rep1. Nếu bạn thực hiện 'git pull' trong rep2, nó sẽ nhận thấy rằng chúng ở cùng trạng thái và ngừng phàn nàn. Để thực sự thấy những thay đổi từ một lần đẩy trong một bản sao đang hoạt động, bạn cần thực hiện một 'kiểm tra git' - đẩy không bao giờ chạm vào bản sao làm việc của repo Dest.
Walter Mundt

Tôi nghĩ đó có thể là trường hợp đó nhưng tôi nhận được "git checkout M README Chi nhánh của bạn đi trước 'origin / master' bằng 1 lần xác nhận." Nhưng bản sao làm việc của tôi thực sự đứng sau 1 cam kết, không đi trước.
Steve Hindmarch

1

Nó đang đợi bạn "đẩy". Thử:

$ git push


1

Tôi đã gặp vấn đề này gần đây và tôi nghĩ rằng đó là vì tôi đã xóa một số tệp mà tôi không cần nữa. Vấn đề là git không biết rằng các tệp đã bị xóa và nó thấy rằng máy chủ vẫn còn có nó. (máy chủ = nguồn gốc)

Vì vậy, tôi đã chạy

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

Và sau đó chạy một cam kết và đẩy.

Điều đó đã giải quyết vấn đề.


1
Điều này chỉ hoạt động nếu thông báo cam kết xóa - <tên tệp>
looneydoodle

1

Tôi là một người mới git là tốt. Tôi gặp vấn đề tương tự với 'chi nhánh của bạn đi trước nguồn gốc / thông điệp của N cam kết'. Thực hiện đề xuất 'git diff origin / master' đã cho thấy một số khác biệt mà tôi không quan tâm để giữ. Vì thế ...

Vì bản sao git của tôi là để lưu trữ và tôi muốn có một bản sao chính xác của repo chính và không quan tâm đến bất kỳ thay đổi cục bộ nào, tôi quyết định lưu toàn bộ repo của mình và tạo một bản mới:

(trên máy chủ)

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

Để giải quyết vấn đề, tôi thường thay đổi bản sao trên máy chủ của mình. Không còn nữa. Tôi sẽ thực hiện những thay đổi đó cho chủ, git cam kết ở đó và thực hiện thao tác git. Hy vọng, điều này sẽ giữ cho bản sao git của tôi trên máy chủ lưu trữ hoàn toàn đồng bộ.

/ Nara


0

Tôi đã tự hỏi điều tương tự về repo của tôi. Trong trường hợp của tôi, tôi đã có một chiếc điều khiển cũ mà tôi không còn đẩy nữa nên tôi cần phải tháo nó ra.

Nhận danh sách từ xa:

git remote

Xóa cái mà bạn không cần

git remote rm {insert remote to remove}

0

Có thể thiết lập lại một cam kết cụ thể trước khi cam kết của riêng bạn diễn ra.

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

Sử dụng git logđể tìm những gì cam kết là cam kết bạn có trước khi những thay đổi cục bộ diễn ra.

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

Lưu ý các xác nhận cục bộ và đặt lại trực tiếp cho các cam kết trước đó:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

Tôi gặp vấn đề "Chi nhánh của bạn đi trước 'origin / master' bởi nn cam kết." Khi tôi đẩy đến một kho lưu trữ từ xa với:

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

Khi tôi thấy rằng địa chỉ từ xa của tôi đã ở trong tệp .git / FETCH_HEAD và được sử dụng:

git push

vấn đề biến mất

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.