Câu hỏi Đặt lại nhánh kho lưu trữ cục bộ để giống như HEAD kho lưu trữ từ xa


Làm cách nào để đặt lại nhánh địa phương giống như nhánh trên kho lưu trữ từ xa?

Tôi đã làm:

git reset --hard HEAD

Nhưng khi tôi chạy git status,

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

Bạn có thể vui lòng cho tôi biết lý do tại sao tôi có những 'sửa đổi' này? Tôi chưa chạm vào các tệp này? Nếu tôi đã làm, tôi muốn loại bỏ chúng.


2524
2017-10-27 00:27


gốc


Theo đầu ra của git status lệnh thứ hai của bạn git reset --hard HEAD thất bại. Tuy nhiên, bạn không dán đầu ra. → Câu hỏi chưa hoàn chỉnh. - Robert Siemer
Bạn đang trộn hai vấn đề ở đây: 1) làm thế nào để thiết lập lại một chi nhánh địa phương đến điểm mà từ xa và 2) làm thế nào để xóa khu vực dàn dựng của bạn (và có thể là thư mục làm việc), để git statusnói nothing to commit, working directory clean. - Xin hãy chỉ ra cụ thể! - Robert Siemer
@RobertSiemer Đó chính xác là những gì tôi muốn. Làm thế nào để thiết lập lại repo cục bộ của tôi giống như cam kết cuối cùng trên repo từ xa nhưng tôi cũng muốn dọn dẹp repo cục bộ của mình, tôi không muốn có những thay đổi mà tôi có bây giờ và không có trong repo từ xa. Tôi chỉ muốn repo địa phương của tôi được chính xác giống như trong điều khiển từ xa. Bạn có thể cho tôi biết làm thế nào để làm điều đó? - Alex Ventura


Các câu trả lời:


Đặt chi nhánh của bạn để khớp chính xác với nhánh từ xa có thể được thực hiện theo hai bước:

git fetch origin
git reset --hard origin/master

Nếu bạn muốn lưu trạng thái nhánh hiện tại của bạn trước khi thực hiện điều này (chỉ trong trường hợp), bạn có thể thực hiện:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

Bây giờ công việc của bạn được lưu trên nhánh "my-saved-work" trong trường hợp bạn quyết định bạn muốn nó trở lại (hoặc muốn xem nó sau này hoặc phân biệt nó với nhánh cập nhật của bạn).

Lưu ý rằng ví dụ đầu tiên giả định rằng tên của repo từ xa là "origin" và nhánh có tên "master" trong repo từ xa khớp với nhánh hiện đã được kiểm tra trong repo cục bộ của bạn.

BTW, tình huống này mà bạn đang ở trong một vẻ khủng khiếp giống như một trường hợp phổ biến, nơi một push đã được thực hiện vào chi nhánh hiện đang được kiểm tra của một kho không trống. Gần đây bạn đã đẩy vào repo địa phương của bạn? Nếu không, sau đó không phải lo lắng - cái gì khác phải đã gây ra những tập tin này bất ngờ kết thúc sửa đổi. Nếu không, bạn nên lưu ý rằng nó không được khuyến khích để đẩy vào một kho lưu trữ không trống (và không phải vào chi nhánh hiện đã được kiểm tra, đặc biệt).


4474
2017-10-27 01:44



Cảm ơn bạn vì câu trả lời. Bạn nói 'Lưu ý rằng ví dụ đầu tiên giả định rằng tên của repo từ xa là "origin" và nhánh có tên "master" trong repo từ xa khớp với nhánh trong repo cục bộ của bạn.' Làm thế nào tôi có thể kiểm tra lại tên repo từ xa của tôi và tên chi nhánh của tôi để chắc chắn trước khi tôi thực hiện 'git reset --hard'? Cảm ơn một lần nữa. - hap497
Nếu bạn không đặt tên rõ ràng từ xa, thì tên của nó có thể chỉ là "origin" (mặc định). Bạn có thể sử dụng "git remote" để có danh sách tất cả các tên từ xa. Sau đó bạn có thể sử dụng "git remote <name>" để xem nhánh nào đẩy / kéo với nhau (ví dụ: nếu nhánh "master" của bạn được nhân bản từ "master" trong remote name có tên "origin", thì bạn sẽ nhận được một dòng có nghĩa là "master merge with master remote"). - Dan Moulding
"nó không được khuyến khích để đẩy vào một kho không trống (và không phải vào chi nhánh hiện đã được kiểm tra, đặc biệt là" Tại sao vậy? " - LeeGee
Ngay sau khi tìm nạp, tôi tin rằng bạn có thể làm git reset FETCH_HEAD --hard thay vào đó, đó là ý nghĩa tương tự. - Jean
Quá tệ tôi chỉ có thể upvote này một lần. Tôi đã đi đến câu trả lời chính xác này như 20 lần. Có lẽ nhiều hơn nữa. - frosty


Tôi cần làm (giải pháp trong câu trả lời được chấp nhận):

git fetch origin
git reset --hard origin/master

Theo dõi bởi:

git clean -f

để xóa các tệp cục bộ

Để xem tệp nào sẽ bị xóa (không thực sự xóa chúng):

git clean -n -f

250
2017-12-27 06:20



cũng thế, git clean -d -f nếu có các thư mục không được trình bày. - garg
cũng thế git clean -fdx - Swapnil Kotwal
Nếu bạn muốn bản sao chính xác của nhánh từ xa, bạn phải làm theo git clean -ffdx. Lưu ý rằng thare là hai f. - Trismegistos
Các git clean -f là mảnh cần thiết tôi cần. Cảm ơn! - dgo
cẩn thận bằng cách sử dụng lệnh sạch. nó có thể xóa các tập tin bị bỏ qua từ các nhánh khác. - mikoop


Đầu tiên, đặt lại về lần tìm nạp trước đó HEAD của nhánh ngược dòng tương ứng:

git reset --hard @{u}

Ưu điểm của việc xác định @{u} hoặc dạng tiết của nó @{upstream} là tên của repo và chi nhánh từ xa không cần phải được chỉ định rõ ràng.

Tiếp theo, nếu cần, hãy xóa các tệp không được theo dõi, tùy chọn cũng với -x:

git clean -df

Cuối cùng, khi cần, hãy nhận các thay đổi mới nhất:

git pull

119
2018-02-10 20:27



Điều này có vẻ như là một câu trả lời tốt hơn so với câu trả lời được chấp nhận, bởi vì nó sẽ tự động đặt lại về nhánh ngược dòng hiện tại chứ không phải luôn luôn là một phần tĩnh như origin/master - Jon z


git reset --hard HEAD thực sự chỉ đặt lại trạng thái đã cam kết cuối cùng. Trong trường hợp này HEAD đề cập đến HEAD của chi nhánh của bạn.

Nếu bạn có nhiều cam kết, điều này sẽ không hoạt động ..

Những gì bạn có thể muốn làm, được thiết lập lại cho người đứng đầu xuất xứ hoặc bất cứ điều gì bạn lưu trữ từ xa được gọi là. Tôi có lẽ chỉ cần làm một cái gì đó như

git reset --hard origin/HEAD

Hãy cẩn thận mặc dù. Cứng reset không thể dễ dàng được hoàn tác. Nó là tốt hơn để làm như Dan đề nghị, và chi nhánh ra một bản sao của các thay đổi của bạn trước khi đặt lại.


91
2017-10-27 01:08



Có một đề nghị không chính xác trong câu trả lời của tôi mà Dan đã bắt gặp trước đó. Tôi chỉnh sửa nó đi, vì tôi không muốn dẫn bất cứ ai lạc lối. Đối với nguồn gốc / chủ hoặc nguồn gốc / HEAD, tôi hy vọng điều đó phụ thuộc vào việc bạn có thực sự thực hiện tìm nạp trước hay không. Nếu bạn chỉ nhân bản nguồn gốc, và nó không có chi nhánh khác, mà tôi tìm thấy là khá phổ biến, sau đó nó nên thiết lập lại nó tốt. Nhưng tất nhiên, Dan là đúng. - Mikael Ohlson


Tất cả những điều trên đều đúng, nhưng thường là có thật không đặt lại dự án của bạn, bạn cũng cần phải xóa ngay cả các tệp trong .gitignore.

Để có được tương đương đạo đức xóa thư mục dự án của bạn và nhân bản lại từ xa là:

git fetch
git reset --hard
git clean -x -d -f

Cảnh báo: git clean -x -d -f Là không thể đảo ngược và bạn có thể mất tệp và dữ liệu (ví dụ: những thứ bạn đã bỏ qua bằng cách sử dụng .gitignore).


57
2017-07-23 17:48



Cảnh báo: "git clean -x -d -f" không thể đảo ngược và bạn có thể mất tệp và dữ liệu trong .gitignore - Akarsh Satija
câu trả lời hay nhất; cảm ơn. - Bob Baxley


Câu hỏi kết hợp hai vấn đề ở đây:

  1. làm thế nào để thiết lập lại một chi nhánh địa phương đến điểm mà từ xa là
  2. làm thế nào để xóa khu vực dàn dựng của bạn (và có thể là thư mục làm việc), để git statusnói nothing to commit, working directory clean.

Câu trả lời một lần là:

  1. git fetch --prune  (tùy chọn) Cập nhật ảnh chụp cục bộ của repo từ xa. Các lệnh khác chỉ là cục bộ.
    git reset --hard @{upstream}Đặt con trỏ nhánh cục bộ đến nơi ảnh chụp nhanh của điều khiển từ xa, cũng như đặt chỉ mục và thư mục làm việc thành các tệp của cam kết đó.
  2. git clean -d --force  Loại bỏ các tập tin và thư mục không đúng cách mà cản trở git nói "làm việc thư mục sạch".

29
2018-01-31 01:29



Các @{upstream} cú pháp yêu cầu thượng nguồn phải được đặt theo mặc định nếu bạn git checkout <branchname>. - Nếu không, hãy thay thế bằng origin/<branchname>. - Robert Siemer
Thêm vào -x đến git clean để xóa mọi thứ không có trong cam kết (ví dụ: ngay cả các tệp bị bỏ qua với cơ chế .gitignore). - Robert Siemer


Đây là thứ tôi thường xuyên phải đối mặt, và tôi đã tổng quát kịch bản Wolfgang cung cấp ở trên để làm việc với bất kỳ chi nhánh nào

Tôi cũng đã thêm lời nhắc "bạn chắc chắn" và một số phản hồi đầu ra

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

20
2017-11-09 13:01



bạn có thể muốn sử dụng "git remote" để lấy tên của điều khiển từ xa. Trong một số trường hợp, nó sẽ không phải là "nguồn gốc" - Yurik


Đây là một kịch bản tự động hóa những gì câu trả lời phổ biến nhất cho thấy ... Xem https://stackoverflow.com/a/13308579/1497139 cho một phiên bản cải tiến hỗ trợ các chi nhánh

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

11
2017-10-15 08:50





Miễn là kho lưu trữ từ xa là originvà bạn quan tâm đến branch_name:

git fetch origin
git reset --hard origin/<branch_name>

Ngoài ra, bạn hãy thiết lập lại nhánh hiện tại của origin đến HEAD.

git fetch origin
git reset --hard origin/HEAD

Làm thế nào nó hoạt động:

git fetch origin tải xuống mới nhất từ ​​xa mà không cố gắng hợp nhất hoặc rebase bất cứ điều gì.

Sau đó, git reset đặt lại <branch_name> chi nhánh cho những gì bạn vừa tìm nạp. Các --hard tùy chọn thay đổi tất cả các tệp trong cây đang hoạt động của bạn để khớp với các tệp trong origin/branch_name.


11
2018-05-08 11:12





Tôi đã làm:

git branch -D master
git checkout master

để đặt lại toàn bộ chi nhánh


lưu ý, bạn nên thanh toán cho một chi nhánh khác để có thể xóa chi nhánh được yêu cầu


10
2018-05-14 07:48



Bạn nên đọc câu hỏi một lần nữa, không có gì trên ảnh hưởng đến từ xa, nhưng thiết lập để giống như từ xa, vì vậy bạn không nên làm bất cứ điều gì với từ xa, và điều này đã giúp trong trường hợp của tôi và không ở trên. - user2846569
Nếu bạn muốn đặt nó giống như điều khiển từ xa, ít nhất bạn nên thực hiện tìm nạp tại một thời điểm nào đó, bạn có đồng ý không? - Tim Castelijns
bạn nên ít nhất thử tài liệu này hoặc đọc: kernel.org/pub/software/scm/git/docs/git-checkout.html - user2846569
Không có nhánh nào khác ;-) Tôi nghĩ rằng bước bổ sung là thứ bạn nên chỉnh sửa nó vào câu trả lời của bạn, và nếu bạn làm tôi sẽ loại bỏ downvote (không thể ngay bây giờ vì nó bị khóa) - Tim Castelijns
Vì vậy, tạo một tạm thời. - qaisjp


Nếu bạn có vấn đề với tôi, rằng bạn đã thực hiện một số thay đổi, nhưng bây giờ, vì bất kỳ lý do nào bạn muốn loại bỏ nó, cách nhanh nhất là sử dụng git reset như thế này:

git reset --hard HEAD~2

Tôi đã có 2 cam kết không cần thiết, do đó số 2. Bạn có thể thay đổi nó thành số cam kết của riêng bạn để thiết lập lại.

Vì vậy, trả lời câu hỏi của bạn - nếu bạn là 5 commit trước HEAD kho lưu trữ từ xa, bạn nên chạy lệnh sau:

git reset --hard HEAD~5

Lưu ý rằng bạn sẽ mất các thay đổi bạn đã thực hiện, vì vậy hãy cẩn thận!


7
2018-06-16 03:35