로컬 Git 변경 사항을 제거하는 다양한 방법
방금 git 저장소를 복제하고 브랜치를 확인했습니다. 작업 한 다음 원본을 원했기 때문에 로컬 변경 사항을 모두 제거하기로 결정했습니다.
즉, 로컬 변경 사항을 제거하려면 다음 두 명령을 수행해야했습니다.
git checkout .
git clean -f
제 질문은
(1) 이것이 로컬 변경을 제거하는 올바른 접근 방식입니까, 아니면 올바른 접근 방식을 알려주십시오.
(2) git reset --hard
이 명령 없이도 재설정 할 수 있으므로 언제 사용합니까?
감사
* 솔루션 : Major Edit (s) : 03/26 : * 많은 모호한 용어를 git 특정 용어로 대체 했습니다. [tracked / untracked / staged / unstaged]
로컬 변경을 수행 할 때 파일 범주는 세 가지뿐 일 수 있습니다.
유형 1. 준비된 추적 파일
유형 2. Unstaged 추적 파일
유형 3. Unstaged UnTracked 파일 일명 UnTracked 파일
- 스테이징-스테이징 영역으로 이동 / 인덱스에 추가 된 항목
- 추적 됨-수정 된 파일
- 추적되지 않음-새 파일. 항상 언 스테이지. 스테이징 된 경우 추적된다는 의미입니다.
각 명령이 수행하는 작업 :
git checkout .
-Unstaged Tracked 파일 만 제거 [Type 2]git clean -f
-Unstaged UnTracked 파일 만 제거 [Type 3]git reset --hard
-Staged Tracked 및 UnStaged Tracked 파일 만 제거 [Type 1, Type 2]git stash -u
-모든 변경 사항 제거 [유형 1, 유형 2, 유형 3]
결론:
우리가 둘 중 하나를 사용할 수 있다는 것이 분명합니다.
(1) combination of `git clean -f` and `git reset --hard`
또는
(2) `git stash -u`
원하는 결과를 얻을 수 있습니다.
참고 : '지정된 장소에 (무언가) 안전하고 비밀리에 보관'을 의미하는 은닉입니다. 이것은 항상를 사용하여 검색 할 수 있습니다 git stash pop
. 따라서 위의 두 옵션 중에서 선택하는 것은 개발자의 요청입니다.
Christoph와 Frederik Schøning에게 감사드립니다.
편집 : 03/27
나는 ' 주의 '메모를 넣을 가치가 있다고 생각했습니다.git clean -f
git clean -f
돌아갈 수 없습니다. 사용 -n
또는 --dry-run
당신이 할 것이다 피해를 미리 볼 수 있습니다.
디렉토리도 제거하려면 다음을 실행하십시오. git clean -f -d
무시 된 파일 만 제거하려면 다음을 실행하십시오. git clean -f -X
무시 된 파일과 무시되지 않은 파일을 제거하려면 다음을 실행하십시오. git clean -f -x
참조 : 추가 정보 git clean
: 현재 Git 작업 트리에서 로컬 (추적되지 않은) 파일을 제거하는 방법은 무엇입니까?
편집 : 05/20/15
이 분기의 모든 로컬 커밋 삭제 [로컬 커밋 제거]
이 분기의 모든 로컬 커밋을 삭제하려면 로컬 분기를이 분기의 "업스트림"과 동일하게 만들려면 다음을 실행하십시오. git reset --hard @{u}
참조 : http://sethrobertson.github.io/GitFixUm/fixup.html
또는 git reset --hard origin/master
[로컬 브랜치 인 경우 master
]
참고 : 2015 년 6 월 12 일 이것은 중복으로 표시된 다른 SO 질문의 중복 이 아닙니다 . 이 질문은 로컬 GIT 변경 사항을 제거하는 방법 [추가 된 파일 제거, 기존 파일에 추가 된 변경 사항 제거 등 및 다양한 접근 방식; 다른 SO 스레드에서는 로컬 커밋을 제거하는 방법 만 설명합니다. 파일을 추가하고 그 파일 만 제거하려는 경우 다른 SO 스레드는 이에 대해 논의하지 않습니다. 따라서 이것은 다른 것과 중복되지 않습니다.]
편집 : 06/23/15
이미 원격 저장소에 푸시 된 커밋을 되 돌리는 방법은 무엇입니까?
$ git revert ab12cd15
수정 : 2015 년 9 월 1 일
로컬 분기 및 원격 분기에서 이전 커밋 삭제
케이스 : 방금 로컬 브랜치에 변경 사항을 커밋하고 즉시 원격 브랜치로 푸시했습니다. 갑자기 깨달았습니다. 이 변경은 필요하지 않습니다. 이제 무엇을합니까?
git reset --hard HEAD~1
[로컬 브랜치에서 해당 커밋 삭제]
git push origin HEAD --force
[두 명령을 모두 실행해야합니다. 원격 지점에서 삭제]
지점은 무엇입니까? 현재 체크 아웃 된 지점입니다.
2015 년 9 월 8 일 편집 -로컬 자식 병합 제거 :
나는 지점에 있고 새로 작업하는 지점과 master
지점을 병합 master
했습니다.phase2
$ git status
# On branch master
$ git merge phase2
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.
Q :이 병합을 제거하는 방법은 무엇입니까? 시도 git reset --hard
하고 git clean -d -f
모두 작동하지 않았다.
효과 가 있었던 유일한 것은 다음 중 하나입니다.
$ git reset --hard origin/master
또는
$ git reset --hard HEAD~8
또는
$ git reset --hard 9a88396f51e2a068bb7
[sha commit code-이것은 모든 병합 커밋이 발생하기 전에 존재했던 코드입니다.]
그것은 모두 실행 취소 / 되돌리려는 대상에 따라 다릅니다. Ube의 링크에있는 게시물 을 읽고 시작하십시오 . 그러나 대답을 시도하려면 :
하드 리셋
git reset --hard [HEAD]
추적 된 파일에 대한 모든 준비 및 준비되지 않은 변경 사항을 완전히 제거합니다.
"리모컨에서 완전히 다시 복제 한 것처럼 모든 것을 실행 취소"하고 싶을 때 하드 리셋을 자주 사용합니다. 귀하의 경우에는 리포지토리를 원할 경우 이것이 작동합니다.
깨끗한
git clean [-f]
추적되지 않는 파일을 제거하십시오.
임시 파일을 제거하지만 이미 추적 된 파일에 대해 준비된 변경 사항과 준비되지 않은 변경 사항을 유지합니다. 대부분의 경우 반복적으로 정리하는 대신 무시 규칙을 만드는 것으로 끝날 것입니다. 예를 들어 C # 프로젝트의 bin / obj 폴더, 일반적으로 공간을 절약하기 위해 리포지토리에서 제외하려는 경우 등이 있습니다.
에 -f (강제) 옵션은 추적되지 않는 파일을 제거 하고 무시 규칙을하지만 또한 자식에 의해 무시됩니다. 위의 경우 bin / obj 폴더를 추적하지 않는 ignore-rule을 사용하여 이러한 폴더가 git에 의해 무시 되더라도 force- 옵션을 사용하면 파일 시스템에서 해당 폴더가 제거됩니다. 예를 들어 배포를 스크립팅 할 때이 용도를 산발적으로 보았습니다. 배포, 압축 등의 작업 전에 코드를 정리하고 싶습니다.
Git clean은 이미 추적중인 파일을 건드리지 않습니다.
체크 아웃 "점"
git checkout .
나는 실제로 당신의 게시물을 읽기 전에이 표기법을 본 적이 없습니다. 나는 이것에 대한 문서를 찾는 데 어려움을 겪고 있지만 (누군가가 도울 수 있을지도 모르지만) 조금 놀아 보면 다음을 의미하는 것처럼 보입니다.
"내 작업 트리의 모든 변경 사항을 취소합니다".
즉, 추적 된 파일의 단계 화되지 않은 변경 사항을 실행 취소합니다. 분명히 단계적 변경을 건드리지 않고 추적되지 않은 파일 만 남겨 둡니다.
은닉
일부 답변은 숨김에 대해 언급합니다. 표현에서 알 수 있듯이, (커밋 할 준비가되지 않은) 무언가 중간에있을 때 stashing을 사용하고 일시적으로 분기를 전환하거나 코드의 다른 상태에서 작업 한 후 나중에 "지저분한"상태로 돌아 가야합니다. 책상". 이것이 귀하의 질문에 적용되지는 않지만 확실히 편리합니다.
요약하자면
Generally, if you are confident you have committed and maybe pushed to a remote important changes, if you are just playing around or the like, using git reset --hard HEAD
followed by git clean -f
will definitively cleanse your code to the state, it would be in, had it just been cloned and checked out from a branch. It's really important to emphasize, that the resetting will also remove staged, but uncommitted changes. It will wipe everything that has not been committed (except untracked files, in which case, use clean).
All the other commands are there to facilitate more complex scenarios, where a granularity of "undoing stuff" is needed :)
귀하의 질문 # 1이 다루어졌지만 마지막으로 # 2에서 결론을 내릴 수 있습니다. 사용할 필요성을 찾지 못한 이유 git reset --hard
는 아무것도 준비하지 않았기 때문입니다. 당신이 변화를 개최했다, 어느 쪽 git checkout .
도 git clean -f
있다는 복귀 것이다.
이것이 커버되기를 바랍니다.
git의 모든 것과 마찬가지로 여러 가지 방법이 있습니다. 사용한 두 명령은이를 수행하는 한 가지 방법입니다. 당신이 할 수 있었던 또 다른 일은 단순히 그들을 git stash -u
. 는 -u
(비 추적) 새로 추가 된 파일도 포함되어 있는지 확인합니다.
핸디 것은 약 git stash -u
이다
- 목표를 달성하는 가장 간단한 (유일한?) 단일 명령 일 것입니다.
- 나중에 마음이 바뀌면 모든 작업을 다시 수행
git stash pop
할 수 있습니다 (나중에 마음이 바뀌면 실행 취소 할 수있는 Gmail에서 이메일을 삭제하는 것과 같습니다).
다른 질문으로 git reset --hard
추적되지 않은 파일을 제거하지 않으므로 git clean -f
. 그러나 a git stash -u
가 가장 편리 할 수 있습니다.
현재 답변을 추가하는 이유 :
지금까지 나는 초기 질문 자체에 결론과 '답변'을 추가하여 질문을 매우 길게 만들었으므로 별도의 답변으로 이동했습니다.
나는 또한 다른 사람을 돕기 위해 git에서 나를 돕는 더 자주 사용되는 git 명령 을 추가했습니다 .
기본적으로 모든 로컬 커밋을 정리 $ git reset --hard
하고$ git clean -d -f
First step before you do any commits is to configure your username and email that appears along with your commit.
#Sets the name you want attached to your commit transactions
$ git config --global user.name "[name]"
#Sets the email you want atached to your commit transactions
$ git config --global user.email "[email address]"
#List the global config
$ git config --list
#List the remote URL
$ git remote show origin
#check status
git status
#List all local and remote branches
git branch -a
#create a new local branch and start working on this branch
git checkout -b "branchname"
or, it can be done as a two step process
create branch: git branch branchname
work on this branch: git checkout branchname
#commit local changes [two step process:- Add the file to the index, that means adding to the staging area. Then commit the files that are present in this staging area]
git add <path to file>
git commit -m "commit message"
#checkout some other local branch
git checkout "local branch name"
#remove all changes in local branch [Suppose you made some changes in local branch like adding new file or modifying existing file, or making a local commit, but no longer need that] git clean -d -f
and git reset --hard
[clean all local changes made to the local branch except if local commit]
git stash -u
also removes all changes
Note: It's clear that we can use either (1) combination of git clean –d –f
and git reset --hard
OR (2) git stash -u
to achieve the desired result.
Note 1: Stashing, as the word means 'Store (something) safely and secretly in a specified place.' This can always be retreived using git stash pop. So choosing between the above two options is developer's call.
Note 2: git reset --hard
will delete working directory changes. Be sure to stash any local changes you want to keep before running this command.
# Switch to the master branch and make sure you are up to date.
git checkout master
git fetch
[this may be necessary (depending on your git config) to receive updates on origin/master ]
git pull
# Merge the feature branch into the master branch.
git merge feature_branch
# Reset the master branch to origin's state.
git reset origin/master
#Accidentally deleted a file from local , how to retrieve it back? Do a git status
to get the complete filepath of the deleted resource
git checkout branchname <file path name>
that's it!
#Merge master branch with someotherbranch
git checkout master
git merge someotherbranchname
#rename local branch
git branch -m old-branch-name new-branch-name
#delete local branch
git branch -D branch-name
#delete remote branch
git push origin --delete branchname
or
git push origin :branch-name
#revert a commit already pushed to a remote repository
git revert hgytyz4567
#branch from a previous commit using GIT
git branch branchname <sha1-of-commit>
#Change commit message of the most recent commit that's already been pushed to remote
git commit --amend -m "new commit message"
git push --force origin <branch-name>
# Discarding all local commits on this branch [Removing local commits]
In order to discard all local commits on this branch, to make the local branch identical to the "upstream" of this branch, simply run
git reset --hard @{u}
Reference: http://sethrobertson.github.io/GitFixUm/fixup.html or do git reset --hard origin/master
[if local branch is master]
# Revert a commit already pushed to a remote repository?
$ git revert ab12cd15
#Delete a previous commit from local branch and remote branch
Use-Case: You just commited a change to your local branch and immediately pushed to the remote branch, Suddenly realized , Oh no! I dont need this change. Now do what?
git reset --hard HEAD~1
[for deleting that commit from local branch. 1 denotes the ONE commit you made]
git push origin HEAD --force
[both the commands must be executed. For deleting from remote branch]. Currently checked out branch will be referred as the branch where you are making this operation.
#Delete some of recent commits from local and remote repo and preserve to the commit that you want. ( a kind of reverting commits from local and remote)
Let's assume you have 3 commits that you've pushed to remote branch named 'develop
'
commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.
To revert to old commit ( to change the state of branch)
git log --oneline --decorate --graph
// to see all your commitids
git clean -d -f
// clean any local changes
git reset --hard commitid-1
// locally reverting to this commitid
git push -u origin +develop
// push this state to remote. + to do force push
# Remove local git merge: Case: I am on master branch and merged master branch with a newly working branch phase2
$ git status
On branch master
$ git merge phase2
$ git status
On branch master
Your branch is ahead of 'origin/master' by 8 commits.
Q: How to get rid of this local git merge? Tried git reset --hard
and git clean -d -f
Both didn't work. The only thing that worked are any of the below ones:
$ git reset --hard origin/master
or
$ git reset --hard HEAD~8
or
$ git reset --hard 9a88396f51e2a068bb7
[sha commit code - this is the one that was present before all your merge commits happened]
#create gitignore file
touch .gitignore
// create the file in mac or unix users
sample .gitignore contents:
.project
*.py
.settings
Reference link to GIT cheat sheet: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf
1. When you don't want to keep your local changes at all.
git reset --hard
This command will completely remove all the local changes from your local repository. This is the best way to avoid conflicts during pull command, only if you don't want to keep your local changes at all.
2. When you want to keep your local changes
If you want to pull the new changes from remote and want to ignore the local changes during this pull then,
git stash
It will stash all the local changes, now you can pull the remote changes,
git pull
Now, you can bring back your local changes by,
git stash pop
Use:
git checkout -- <file>
To discard the changes in the working directory.
I think git has one thing that isn't clearly documented. I think it was actually neglected.
git checkout .
Man, you saved my day. I always have things I want to try using the modified code. But the things sometimes end up messing the modified code, add new untracked files etc. So what I want to do is, stage what I want, do the messy stuff, then cleanup quickly and commit if I'm happy.
There's git clean -fd
works well for untracked files.
Then git reset
simply removes staged, but git checkout
is kinda too cumbersome. Specifying file one by one or using directories isn't always ideal. Sometimes the changed files I want to get rid of are within directories I want to keep. I wished for this one command that just removes unstaged changes and here you're. Thanks.
But I think they should just have git checkout
without any options, remove all unstaged changes and not touch the the staged. It's kinda modular and intuitive. More like what git reset
does. git clean
should also do the same.
The best way is checking out the changes.
Changing the file pom.xml in a project named project-name you can do it:
git status
# modified: project-name/pom.xml
git checkout project-name/pom.xml
git checkout master
# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'
For discard all i like to stash and drop that stash, it's the fastest way to discard all, especially if you work between multiple repos.
This will stash all changes in {0}
key and instantly drop it from {0}
git stash && git stash drop
First of all check is your important change saved or not by:
$ git status
than try
$ git reset --hard
it will reset your branch to default
but if you need just undo:
$ edit (1) $ git add frotz.c filfre.c $ mailx (2) $ git reset
(3) $ git pull git://info.example.com/ nitfol
Read more >> https://git-scm.com/docs/git-reset
참고URL : https://stackoverflow.com/questions/22620393/various-ways-to-remove-local-git-changes
'Nice programing' 카테고리의 다른 글
.NET을 사용하여 16 진수 색상 코드에서 색상을 얻으려면 어떻게합니까? (0) | 2020.10.03 |
---|---|
속성 이름을 포함하는 변수로 개체 속성이 있는지 확인하는 방법은 무엇입니까? (0) | 2020.10.02 |
PHP 구문 분석 / 구문 오류; (0) | 2020.10.02 |
원시 유형은 무엇이며 왜 사용하지 않아야합니까? (0) | 2020.10.02 |
SQL 조인 : where 절 대 on 절 (0) | 2020.10.02 |