Git push sẽ không làm được gì cả (mọi thứ đều được cập nhật)


100

Tôi đang cố gắng cập nhật kho lưu trữ Git trên GitHub. Tôi đã thực hiện một loạt các thay đổi, thêm chúng, cam kết sau đó cố gắng thực hiện a git push. Câu trả lời cho tôi biết rằng mọi thứ đều được cập nhật, nhưng rõ ràng là không.

git remote show origin

phản hồi với kho lưu trữ mà tôi mong đợi.

Tại sao Git cho tôi biết kho lưu trữ được cập nhật khi có các cam kết cục bộ không hiển thị trên kho lưu trữ?

  [searchgraph]  git status
# On branch develop
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       Capfile
#       config/deploy.rb
nothing added to commit but untracked files present (use "git add" to track)

  [searchgraph]  git add .

  [searchgraph]  git status
# On branch develop
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   Capfile
#       new file:   config/deploy.rb
#

  [searchgraph]  git commit -m "Added Capistrano deployment"
[develop 12e8af7] Added Capistrano deployment
 2 files changed, 26 insertions(+), 0 deletions(-)
 create mode 100644 Capfile
 create mode 100644 config/deploy.rb

  [searchgraph]  git push
Everything up-to-date

  [searchgraph]  git status
# On branch develop
nothing to commit (working directory clean)

Câu trả lời:


142

git pushkhông đẩy tất cả các chi nhánh cục bộ của bạn: làm thế nào nó biết được các chi nhánh ở xa nào để đẩy chúng đến? Nó chỉ đẩy các nhánh cục bộ đã được cấu hình để đẩy đến một nhánh từ xa cụ thể.

Trên phiên bản Git (1.6.5.3) của tôi, khi tôi chạy git remote show originnó thực sự in ra những nhánh nào được cấu hình để đẩy:

Local refs configured for 'git push':
  master pushes to master (up to date)
  quux   pushes to quux   (fast forwardable)

Q. Nhưng tôi có thể đẩy đến mastermà không cần lo lắng về tất cả những điều này!

Khi bạn git clone, theo mặc định, nó thiết lập masternhánh cục bộ của bạn để đẩy đến masternhánh của điều khiển từ xa (gọi tắt là cục bộ origin/master), vì vậy nếu bạn chỉ cam kết trên master, thì một thao tác đơn giản git pushsẽ luôn đẩy các thay đổi của bạn trở lại.

Tuy nhiên, từ đoạn mã đầu ra bạn đã đăng, bạn đang ở trên một nhánh có tên develop, mà tôi đoán là chưa được thiết lập để đẩy đến bất kỳ thứ gì. Vì vậy, git pushkhông có đối số sẽ không đẩy các cam kết trên nhánh đó.

Khi nó nói "Mọi thứ đều cập nhật", nó có nghĩa là "tất cả các chi nhánh bạn đã nói với tôi cách đẩy đều được cập nhật".

Q. Vậy làm cách nào để tôi có thể thực hiện cam kết của mình?

Nếu những gì bạn muốn làm là đưa các thay đổi của mình developvào origin/master, thì có lẽ bạn nên hợp nhất chúng vào cục bộ của mình masterrồi đẩy:

git checkout master
git merge develop
git push             # will push 'master'

Nếu những gì bạn muốn là tạo một developnhánh trên điều khiển từ xa, tách biệt với master, sau đó cung cấp các đối số cho git push:

git push origin develop

Điều đó sẽ: tạo một nhánh mới trên điều khiển từ xa được gọi develop; cập nhật chi nhánh đó với developchi nhánh địa phương của bạn ; đặt developđể đẩy đến origin/developđể trong tương lai, git pushkhông có đối số sẽdevelop tự động đẩy .

Nếu bạn muốn đẩy cục bộ của mình developđến một nhánh từ xa có tên khác develop , thì bạn có thể nói:

git push origin develop:something-else

Tuy nhiên, biểu mẫu đó sẽ không được thiết lập developđể luôn được đẩy lên origin/something-elsetrong tương lai; đó là một hoạt động một lần.


Cảm ơn rất nhiều, git push origin của bạn phát triển: cái gì đó-người khác đã đưa ra câu trả lời cho câu hỏi mà tôi đã không thể nhận được trong một thời gian.
Antroid

1
Trong trường hợp của tôi git push origin xvẫn không thiết lập nhánh x sẽ được đẩy trong tương lai. Đó là do một pushspec cụ thể trong .gitconfig [remote "origin"]phần đã gây ra hành vi của git.
Raman

27

Điều này đã xảy ra với tôi khi ứng dụng SourceTree của tôi bị lỗi trong quá trình chạy. Và trên dòng lệnh, có vẻ như trước đó git addđã bị lỗi. Nếu đúng như vậy, hãy thử:

git init
git add -A
git commit -m 'Fix bad repo'
git push

Ở lệnh cuối cùng, bạn có thể cần thiết lập nhánh.

git push --all origin master

Hãy nhớ rằng điều này là đủ nếu bạn chưa thực hiện bất kỳ phân nhánh nào hoặc bất kỳ loại nào như vậy. Trong trường hợp đó, hãy chắc chắn rằng bạn đẩy đến đúng nhánh như thế git push origin develop.


15

Thử:

git push --all origin

điều này đẩy các cam kết để tách các nhánh trên repo, không phải từ một nhánh thành chủ.
Sreedevi J

13

Hãy thử đi đến cam kết cuối cùng và sau đó thực hiện git push origin HEAD:master.


1
Điều này thực sự đã hoạt động. Bạn có muốn giải thích tại sao nó hoạt động không?
René Nyffenegger

Nội dung từ tài liệu:Push the current branch to the remote ref matching master in the origin repository. This form is convenient to push the current branch without thinking about its local name.
uruapanmexicansong

Làm việc cho tôi cũng vậy
Jerad Rutnam

Tôi đã so sánh cách repo của tôi được cấu hình và tất cả các nhánh trông giống nhau. Tuy nhiên, trong một chi nhánh tôi có thể không chỉ đơn giản sử dụng git push: / Điều này làm việc cho tôi là tốt: git push origin HEAD:my_branch_name.
iaforek

6

Đối với trường hợp của tôi, không có giải pháp nào khác hoạt động. Tôi đã phải sao lưu các tệp được sửa đổi mới (được hiển thị bằng git status) và chạy a git reset --hard. Điều này cho phép tôi thiết kế lại với máy chủ từ xa. Thêm tệp sửa đổi mới và chạy

git add .
git commit -am "my comment"
git push

Đã lừa. Tôi hy vọng điều này sẽ giúp ai đó, như một giải pháp "cơ hội cuối cùng".


4

Ngay bây giờ, nó xuất hiện khi bạn đang ở trên nhánh phát triển. Bạn có một chi nhánh phát triển trên nguồn gốc của bạn? Nếu không, hãy thử git push origin develop.git pushsẽ hoạt động khi nó biết về một nhánh phát triển trên nguồn gốc của bạn.

Khi đọc thêm, tôi sẽ xem các trang git-push man , cụ thể là phần ví dụ.


3

Để cụ thể, nếu bạn muốn hợp nhất một cái gì đó để làm chủ, bạn có thể làm theo các bước dưới đây.

git add --all // If you want to stage all changes other options also available
git commit -m "Your commit message"
git push // By default when it clone is sets your origin to master or you would have set sometime with git push -u origin master.

Đó là một thực tế phổ biến trong mô hình yêu cầu kéo là tạo một nhánh cục bộ mới và sau đó đẩy nhánh đó đến từ xa. Vì vậy, bạn cần phải đề cập đến nơi bạn muốn đẩy các thay đổi của mình từ xa. Bạn có thể làm điều này bằng cách đề cập đến điều khiển từ xa tại thời điểm đẩy.

git push origin develop // It will create a remote branch with name "develop".

Nếu bạn muốn tạo một chi nhánh khác với tên chi nhánh cục bộ của mình, bạn có thể thực hiện điều đó bằng lệnh sau.

git push origin develop:some-other-name

2

Cảm ơn Sam Stokes. Theo câu trả lời của anh ấy, bạn có thể giải quyết vấn đề bằng cách khác (tôi đã sử dụng cách này). Sau khi cập nhật thư mục phát triển của bạn, bạn nên khởi động lại nó

git init

Sau đó, bạn có thể cam kết và đẩy các bản cập nhật lên master


1
Cảm ơn! Trong trường hợp của tôi, gõ: git initvà mở một tab lệnh mới, gõ:git push origin branch_name
s7ven

2

Điều này đã xảy ra với tôi khi tôi ^Cđang git pushchuyển đến GitHub. Tuy nhiên, GitHub không cho thấy rằng các thay đổi đã được thực hiện.

Để khắc phục, tôi đã thực hiện một thay đổi đối với cây làm việc của mình, cam kết và sau đó đẩy lại. Nó hoạt động hoàn toàn tốt.


2

Điều này đã xảy ra với tôi. Tôi chỉ cam kết lại các thay đổi, và sau đó nó được đẩy.


2

Tôi đã thử nhiều phương pháp bao gồm cả được xác định ở đây. Những gì tôi nhận được là,

  • Đảm bảo rằng tên của kho lưu trữ hợp lệ. Cách tốt nhất là sao chép liên kết từ trang web lưu trữ và dán vào git bash.

  • Đảm bảo rằng bạn đã cam kết các tệp đã chọn.

    git commit -m "Your commit here"
    
  • Nếu cả hai bước đều không hiệu quả, hãy thử

    git push -u -f origin master


1

Thay vào đó, bạn có thể thử những cách sau. Bạn không cần phải đi đếnmaster ; bạn có thể trực tiếp thúc đẩy các thay đổi từ chính nhánh của bạn.

Như đã giải thích ở trên, khi bạn thực hiện rebase, bạn đang thay đổi lịch sử trên nhánh của mình. Do đó, nếu bạn cố gắng thực hiện bình thường git pushsau khi rebase, Git sẽ từ chối nó vì không có đường dẫn trực tiếp từ cam kết trên máy chủ đến cam kết trên chi nhánh của bạn. Thay vào đó, bạn sẽ cần sử dụng -fhoặc --forcecờ để nói với Git rằng có, bạn thực sự biết mình đang làm gì. Khi thực hiện lực đẩy, bạn nên đặt cài đặt push.defaultcấu hình của mình thành đơn giản, đây là cài đặt mặc định trong Git 2.0. Để đảm bảo rằng cấu hình của bạn là chính xác, hãy chạy:

$ git config --global push.default simple

Khi đã chính xác, bạn chỉ có thể chạy:

$ git push -f

Và kiểm tra yêu cầu kéo của bạn. Nó nên được cập nhật!

Chuyển đến cuối Cách căn cứ lại một yêu cầu kéo để biết thêm chi tiết.


0

Đồng thời đảm bảo rằng bạn đang đẩy đến đúng nhánh.


0

Điều này đã xảy ra với tôi khi tôi cố gắng đẩy từ một chi nhánh mới và tôi đã sử dụng git push origin masterthay thế. Bạn nên:

  • Sử dụng: git push origin your_new_branch nếu bạn muốn rằng nhánh này cũng xuất hiện trong repo từ xa.
  • Nếu không, hãy kiểm tra các thứ hợp nhất chi nhánh chủ của bạn, sau đó đẩy từ tổng thể sang repo git với git merge origin master.

Tóm tắt: điểm ở đây là bạn nên kiểm tra nơi bạn cung cấp tham số thứ hai cho git merge. Vì vậy, nếu bạn đang ở trong master, hãy sử dụng master làm tham số thứ hai nếu bạn đang ở new_branch, hãy sử dụng nó làm tham số thứ hai nếu bạn muốn giữ nhánh này trong repo từ xa, hãy chọn tùy chọn thứ hai ở trên.


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.