2012-01-29 31 views
25

Tôi mới đến git, và tôi không thể hiểu được hành vi sau đây:'Chi nhánh của bạn ở phía trước' origin/master 'bằng 1 commit' trên push rõ ràng

Tôi có một repo bitbucket Tôi nhân bản cục bộ, sau đó tôi sửa đổi và cam kết cục bộ, sau đó tôi đẩy đến repo từ xa. Nếu tôi đẩy mạnh tiềm ẩn, hoặc 'đẩy nguồn gốc', thì không có vấn đề gì. Nếu tôi đẩy sử dụng url từ xa rõ ràng, tôi nhận được thông báo trạng thái 'Nhánh của bạn ở phía trước' origin/master 'bằng 1 commit'.

Dường như git không nhận ra địa chỉ rõ ràng giống như nguồn gốc, vì vậy chính xác những gì đang diễn ra. Nếu tôi thực hiện một cú đẩy ngầm khác, nó sẽ không làm gì cả, nhưng nó làm rõ thông điệp đã nói.

Dưới đây là một phiên mẫu:

[email protected]:/more/coding/git-tests/ask1$ git --version 
git version 1.7.2.5 

[email protected]:/more/coding/git-tests$ git clone https://[email protected]/shishani/dirasi.git ask1 
Cloning into ask1... 
Password: 
remote: Counting objects: 24054, done. 
remote: Compressing objects: 100% (6300/6300), done. 
remote: Total 24054 (delta 17124), reused 24024 (delta 17106) 
Receiving objects: 100% (24054/24054), 11.83 MiB | 251 KiB/s, done. 
Resolving deltas: 100% (17124/17124), done. 

[email protected]:/more/coding/git-tests$ cd ask1 

[email protected]:/more/coding/git-tests/ask1$ jed setup.py 

[email protected]:/more/coding/git-tests/ask1$ git commit -a 
[master a053f28] modified: setup.py 
1 files changed, 1 insertions(+), 0 deletions(-) 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

[email protected]:/more/coding/git-tests/ask1$ git remote show origin 
Password: 
* remote origin 
    Fetch URL: https://[email protected]/shishani/dirasi.git 
    Push URL: https://[email protected]/shishani/dirasi.git 
    HEAD branch: master 
    Remote branch: 
    master tracked 
    Local branch configured for 'git pull': 
    master merges with remote master 
    Local ref configured for 'git push': 
    master pushes to master (fast-forwardable) 

[email protected]:/more/coding/git-tests/ask1$ git push 
Password: 
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (3/3), done. 
Writing objects: 100% (3/3), 314 bytes, done. 
Total 3 (delta 2), reused 0 (delta 0) 
remote: bb/acl: shishani is allowed. accepted payload. 
To https://[email protected]/shishani/dirasi.git 
    5e9ffd1..a053f28 master -> master 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
nothing to commit (working directory clean) 

[email protected]:/more/coding/git-tests/ask1$ jed setup.py 

[email protected]:/more/coding/git-tests/ask1$ git commit -a 
[master 6d0e236] modified: setup.py 
1 files changed, 1 insertions(+), 0 deletions(-) 

[email protected]:/more/coding/git-tests/ask1$ git push https://[email protected]/shishani/dirasi.git master 
Password: 
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (3/3), done. 
Writing objects: 100% (3/3), 298 bytes, done. 
Total 3 (delta 2), reused 0 (delta 0) 
remote: bb/acl: shishani is allowed. accepted payload. 
To https://[email protected]/shishani/dirasi.git 
    a053f28..6d0e236 master -> master 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
**# Your branch is ahead of 'origin/master' by 1 commit.** <-- this does not reflect current state 
# 
nothing to commit (working directory clean) 

[email protected]:/more/coding/git-tests/ask1$ git push 
Password: 
Everything up-to-date 

[email protected]:/more/coding/git-tests/ask1$ git status 
# On branch master 
nothing to commit (working directory clean) 
+0

Câu hỏi này có thể đã bị đóng không chính xác làm bản sao của câu hỏi sai. Ngay sau khi tôi hoàn thành việc nhận được một cây gậy dupe cho Git, tôi sẽ bắt đầu mở lại và đóng các câu hỏi như thế này như là bản sao của [chi nhánh khác của bạn trước câu hỏi 'origin/master'] (https://www.google .com/search? q = + Chi nhánh của bạn + là + trước + trong số +% 27origin% 2Fmaster% 27). –

Trả lời

18

Tôi tin rằng bạn cần phải kéo sự thay đổi trở lại trước khi git sẽ nhận ra rằng kết thúc từ xa đã được cập nhật. Bạn có thể thực hiện điều này thông qua một nhanh git pull (hoặc, như bạn hiển thị trong ví dụ của mình, một số git push đối với nguồn gốc được theo dõi).

Bạn cũng có thể thay đổi cam kết theo cách thủ công theo đó refs/remotes/origin điểm.

Thật không công bằng khi mong đợi trình theo dõi nội dung nhận ra các từ đồng nghĩa từ xa tùy ý cho các kho lưu trữ; hãy tưởng tượng nếu bạn có năm URL khác nhau, tất cả đều là cùng một kho lưu trữ phía máy chủ. Khi bạn đẩy đến repo A, điều đó có nghĩa là các thay đổi của bạn đã được cam kết để repo B (nguồn gốc của chi nhánh của bạn)? git không có cách nào để biết. Thay vào đó, nó chỉ cập nhật tham chiếu đầu từ xa trong hai trường hợp: kéo và đẩy đến đích mặc định.

+0

Tôi đồng ý với những gì bạn đang nói về một repo có các từ đồng nghĩa khác nhau, nhưng nếu chúng tôi đang sử dụng cùng một url chính xác mà git đã biết (và được báo cáo bằng 'remote show origin'), thì tại sao nó không nhận ra sự thật. Sau khi tất cả, một url trỏ đến một tài nguyên duy nhất. Mặt khác, nếu người dùng đang sử dụng một từ đồng nghĩa khác, họ sẽ biết điều đó và sẽ không mong đợi git nhận ra trỏ của nó tới cùng một tài nguyên. –

+0

@BaselShishani Đó là một con dốc trơn. Nếu bạn đã làm những gì bạn đề xuất và so sánh chuỗi chính xác của các URL (thật dễ dàng!), Thì việc đẩy 'https: // shishani @ bitbucket.org/shishani/dirasi.git' sẽ cập nhật phần đầu và' http: // shishani @ bitbucket.org/shishani/dirasi.git' sẽ không. Chuỗi truy vấn Ditto, các giao thức khác nhau, dấu gạch chéo thêm, viết hoa ... Bạn được quyền gửi yêu cầu tính năng tới người git, chúng rất tuyệt! – Borealid

8

Có, bạn sẽ phải thực hiện git fetch hoặc git fetch origin trong trường hợp đó. Git không quan tâm đến nơi bạn đẩy tới, chỉ có các nhánh từ xa (và các chi nhánh theo dõi từ xa) mới là vấn đề quan trọng khi báo cáo trạng thái của số lần commit bạn đang ở trước, v.v.

19

Khi trạng thái nói Your branch is ahead of 'origin/master' by 1 commit, nó thực sự có nghĩa là origin/master. Tức là, có con trỏ có tên là origin/master trong repo của bạn trỏ đến cam kết là HEAD của số remote branchmaster của bạn trước cam kết này.

Đối với tất cả các điều khiển từ xa mà repo của bạn nhận ra, nó tạo ra một con trỏ <remote>/<branchname> trong repo, nếu bạn kéo/đẩy/tìm nạp. Nó chỉ là một con trỏ đến cam kết, và nếu bạn cố gắng để checkout nhánh đó, bạn chỉ ở trạng thái tách rời.

Rõ ràng, con trỏ này được cập nhật khi bạn thực hiện git push hoặc git push origin master, nhưng rõ ràng đẩy vào url sẽ không cập nhật con trỏ đó và do đó trạng thái.

Nếu bạn chỉ cần git fetch hoặc git pull sau khi đẩy vào url, thông báo trạng thái cũng sẽ biến mất trong trường hợp đó. LƯU Ý: Nếu bạn có nhiều điều khiển từ xa và bạn đặt chi nhánh của mình để theo dõi một số chi nhánh từ xa khác, như nói upstream master, thông điệp trạng thái của bạn sẽ trong trường hợp này là, ví dụ: Your branch is ahead of 'upstream/master' by 1 commit. Vì vậy, nó chỉ là nhánh từ xa được theo dõi mà so sánh được thực hiện. Xem git config để xem chi nhánh từ xa mà chi nhánh hiện tại của bạn đang theo dõi.

0

Lưu ý rằng, kể từ khi git1.8.1rc1 (tháng 12 năm 2012), Git will include hint messages:

if (advice_status_hints) 
+  strbuf_addf(sb, 
+  _(" (use \"git push\" to publish your local commits)\n")); 

Khi "git checkout" kiểm tra ra một chi nhánh, nó cho người sử dụng như thế nào xa phía sau (hoặc trước) chi nhánh mới là liên quan đến nhánh theo dõi từ xa mà nó xây dựng dựa trên.
Thông báo bây giờ cũng khuyên cách đồng bộ hóa chúng bằng cách đẩy hoặc kéo.

Điều này có thể bị vô hiệu hóa với biến cấu hình advice.statusHints.

Các vấn đề liên quan