반응형

출처 : https://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked

Git push 에러 '[원격 거부됨] master -> master (브랜치는 현재 체크 아웃되었습니다.)'

어제, 저는 한 머신에서 다른 머신으로 Git 저장소를 성공적으로 복제하는 방법 저는 'git clone'을 다른 머신에서 어떻게 할 수 있나요? 에 대한 질문을 작성하였습니다.

저는 성공적으로 제 원본(192.168.1.2)에서 목적지(192.168.1.1)로 Git 저장소를 성공적으로 복제하였습니다.
하지만 파일을 편집을 하였고 git commit -a -m "test"git push를 하였는데 목적지에서 이 오류가 나왔습니다.

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

저는 Git(원격에서는 1.7 로컬 머신에서는 1.5)의 2가지 버전을 사용하고 있습니다. 이것이 가능한 이유일까요?

31개의 답변 중 1개의 답변만 추려냄

당신은 간단하게 원격 저장소를 bare 저장소로 변경하면 됩니다. (bare 저장소에는 작업 복사본이 없습니다. - 폴더에는 실제 저장소 데이터만 포함됩니다)

당신의 원격 저장소 폴더에서 다음 명령어를 실행합니다.

git config --bool core.bare true

그리고 나서 .git 폴더를 제외하고 모든 파일을 지웁니다. 그리고 나서 당신은 오류 없이 원격 저장소로 git push를 실행할 수 있을 것입니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/35115585/remove-file-from-all-commits

모든 commit에서 파일 지우기

저는 폰트 파일을 업로드 했고 github에 (그 폰트파일을) 몇가지 업데이트를 배포할 권리가 없습니다.

저는 상대적으로 비활성화된 저장소를 가지고 있고 필요할 때 모든 멤버들에게 알릴 수 있는 능력이 있습니다. 저는 이 해결책 중 몇가지를 사용하였습니다. 저는 폰트의 이탈릭체와 진하기 버전의 이름 %font%가 있는 Resources\Video\%font%.ttf 라고 불리는 디렉터리에 파일을 지울 필요가 있습니다. 제가 사용해야 할 명령어는 무엇일까요?

4개의 답변 중 1개의 답변

이러한 경우 당신은 --tree-filter 옵션과 함께 Git Filter Branch 명령을 사용할 수 있습니다.

문법은 git filter-branch --tree-filter <명령> ... 입니다.

git filter-branch --tree-filter 'rm -f Resources\Video\%font%.ttf' -- --all

윈도우즈에서는 / 대신에 \를 사용해야 합니다.

명령어에 대한 설명:

< 명령 > : 구체적인 어떤 shell 명령

--tree-filter : Git은 작업 디렉터리에서 각 commit을 체크하고 당신의 명령을 실행하고 다시 commit할 것입니다.

--index-filter : Git은 git 히스토리는 갱신하지만 작업 디렉터리는 갱신하지 않습니다.

--all : 모든 branch에서 모든 commit을 filter 적용을 합니다.

참고 : 파일 경로가 확실하지 않으므로 파일 경로를 확인하십시오.

이것이 당신에게 도움이 되기를 바랍니다.

반응형
반응형


출처

https://stackoverflow.com/questions/2013091/coloured-git-diff-to-html


Git diff를 HTML에 색칠하여 표시하기

저는 파일에서 변경된 단어를 분명히 보기 위해 git diff --color-words를 사용하는 것을 즐깁니다.

Screenshot

하지만 git이나 색칠한 터미널 없이 다른 누군가와 diff를 공유하고 싶습니다. HTML로 색칠된 터미널 출력으로 변환할 수 있는 도구나 방법을 아시는 분이 있으신가요?

7개 답변 중 1개의 답변만 발췌

wget "http://www.pixelbeat.org/scripts/ansi2html.sh" -O /tmp/ansi2html.sh
chmod +x /tmp/ansi2html.sh
git diff --color-words --no-index orig.txt edited.txt | \
/tmp/ansi2html.sh > 2beshared.html

제가 필요했던 것은 ANSI를 HTML로 변환하는 것(converter)이었습니다. 그리고 저는 매우 어지간한 것을 http://www.pixelbeat.org/에서 발견하였습니다.

참고 : --color 또는 --color-words를 포함시키지 않으면 색상이 표시되지 않을 수 있습니다. 이는 아마도 파이핑(|)으로 인해 git diff가 색상을 제외시키기 때문일 수 있습니다.

참고 2 : 특히 Mac을 사용하는 경우 gnu sed 및 awk를 설치해야 할 수 있습니다. brew install gnu-sed gawk로 설치 하십시오. 경로에 수동으로 추가해야 할 수도 있습니다. 예 : ln -s /usr/local/Cellar/gnu-sed/4.2.2/bin/gsed /usr/local/bin/을 사용하십시오.

반응형
반응형

출처

http://stackoverflow.com/questions/750172/change-the-author-of-a-commit-in-git

Git에서 commit의 author(작가)를 변경하기

저는 학교 컴퓨터로 간단한 스크립트를 작성하면서 (집의 컴퓨터에서 복제된 내 pendrive에 있던 저장소에 있는) Git의 변경사항들을 commit하였습니다. 몇 개를 commit하고 나서 저는 root user로 commit했다는 것을 알았습니다.

제 이름으로 이 commit들의 author(작가)를 변경할 수 있는 방법이 있을까요?


39 개의 답변 중 1개의 답변

참고: 이 답변은 SHA1을 변경하므로 이미 push된 branch에서 사용할 때 주의하십시오. 이름의 철자를 수정하거나 오래된 이메일을 업데이트하려는 경우 git을 사용하면 .mailmap을 사용하여 기록을 다시 쓰지 않고도 이 작업을 수행할 수 있습니다. 저의 다른 답변을 참조하십시오.

Interactive Rebase 사용

당신은

git rebase -i -p <변경할 모든 commit 이전의 임의의 HEAD>

합니다. 다음에 rebase 파일에서 당신이 변경할(bad) commit에서 "edit"로 변경합니다. 만약 당신의 첫 번째 commit을 변경하고 싶다면, rebase 파일에 (다른 줄에 있는 포멧에 따라) 첫 번째 줄에 commit할 내용을 추가해야 합니다. 그리고 git에게 각 commit을 변경할 때 마다 다음을 수행합니다.

git commit --amend --author "New Author Name <email@address.com>" 

수정 또는 열었던 편집기를 닫았으면 다음을 수행합니다.

git rebase --continue

이 명령을 rebase를 계속 이어서 합니다.

만약 --no-edit을 추가함으로서 편집기를 열지 않을 수 있고 그 명령은 다음과 같습니다.

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

하나의 commit

몇몇 댓글달은 분들의 글로부터, 만약 가장 최근 commit만 변경하고 싶으시면 rebase 명령은 필요없습니다. 단지, 다음 명령만 수행하면 됩니다.

git commit --amend --author "New Author Name <email@address.com>"

이는 특정 이름의 author(작가)로 바뀌겠지만 committer는 당신이 git config user.namegit config user.email으로 설정했던 사용자로 설정될 것입니다. 만약 committer를 같이 설정하고 싶으시면 다음처럼 쓰시면 됩니다.

git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

commit을 merge하는 것에 대한 참고 사항

원래 답변에 약간의 오류가 있었습니다. 현재 HEAD<모든 잘못된 커밋 이전의 일부 HEAD> 사이에 commit을 merge할 경우 git rebase는 이를 병합합니다(그런데 GitHub pull 요청을 사용하는 경우 병합이 엄청나게 많을 것입니다. 기록에 커밋). 이것은 매우 자주 매우 다른 기록으로 이어질 수 있으며(중복된 변경 사항이 "리베이스 아웃"될 수 있으므로) 최악의 경우 git rebase가 어려운 병합 충돌(이미 commit을 merge했을 때 해결되었을 가능성이 있음)을 해결하도록 요청할 수 있습니다. 해결책은 git rebase-p 플래그를 사용하여 기록의 merge 구조를 보존하는 것입니다. git rebase에 대한 맨페이지는 -p 및 -i를 사용하면 문제가 발생할 수 있다고 경고하지만 BUGS 섹션에는 "commit을 편집하고 commit 메시지를 다시 작성하면 잘 작동해야 합니다."라고 나와 있습니다.

위의 명령에 -p를 추가했습니다. 가장 최근 커밋을 변경하는 경우에는 문제가 되지 않습니다.

최신 git 클라이언트용 업데이트(2020년 7월)

-p 대신 --rebase-merge를 사용합니다(-p는 더 이상 사용되지 않으며 심각한 문제가 있음).

반응형
반응형

출처 

http://stackoverflow.com/questions/1186535/how-to-modify-a-specified-commit-in-git

Git에서 특정 commit만 수정하는 방법?

저는 리뷰하면서 commit의 모든 목록을 제출합니다. 만약, 

- HEAD

- Commit3

- Commit2

- Commit1

저는 git commit --amend로 HEAD commit을 수정할 수 있다는 걸 알지만, 어떻게 HEADcommit이 아닌 Commit1을 수정할 수 있을까요?

----

4 개의 답변 중 1개의 답변만 추려냄.

당신은 git rebase를 사용할 수 있습니다. 만약 commit bbc643cd으로 돌아가서 수정하고 싶으시면, 다음을 실행합니다.

$ git rebase --interactive 'bbc643cd^'

기본 편집기로, 수정하고 싶은 commit의 줄에서 'pick'을 'edit'로 변경합니다. 원하는 대로 작업 디렉터리를 변경하고 이전과 같은 메세지로 다음처럼 commit 합니다.

$ git commit --all --amend --no-edit (1)

commit을 변경하고, 다음을 입력하여

$ git rebase --continue

이전 HEAD commit으로 돌아옵니다.

경고 : 이는 모든 자식들까지 포함하여 SHA-1 commit이 바뀌게 됨을 아셔야 됩니다. 다른 말로, 이는 그 지점부터 앞으로 history (commit)을 다시 쓰게 됩니다. 만약 git push --force명령을 사용하여 push를 하면 이를 수행한 저장소는 망가질 수 있습니다.

---

역자주

https://git-scm.com/docs/git-commit

(1) git commit --all --amend --no-edit

--all : -a와 같은 의미로 수정되거나 삭제된 파일을 자동으로 stage 영역으로 올립니다.

--amend : commit을 추가하지 않고 마지막 commit을 수정합니다.

--no-edit : --amend와 결합하여 commit 메세지 변화없이 마지막 commit을 수정합니다.



반응형
반응형

출처 

http://unix.stackexchange.com/questions/44266/how-to-colorize-output-of-git

git의 출력에 색을 입히는 방법?

git(또는 명령어)에 대한 출력에 색을 입히는 방법이 있을까요?

다음은 예시입니다.

not stage

baller@Laptop:~/rails/spunky-monkey$ git status
# On branch new-message-types
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   app/models/message_type.rb
#
no changes added to commit (use "git add" and/or "git commit -a")
baller@Laptop:~/rails/spunky-monkey$ git add app/models

stage

baller@Laptop:~/rails/spunky-monkey$ git status
# On branch new-message-types
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   app/models/message_type.rb
#

출력은 같아보입니다만, 정보는 완전히 다릅니다. 파일이 위는 unstaged 상태이고 밑은 stage로 이동한 상태입니다.

이 출력에 색을 입히는 방법이 있을까요? 예를들어 unstage된 파일은 빨간색, stage된 것은 녹색으로요?

또는 Changes not staged for commit:는 빨간색, # Changes to be committed:은 녹색으로요?

Ubuntu에서 작업중입니다.

구글링해서 잘 작동하는 답변을 찾았습니다 : git config --global --add color.ui true

하지만 명령어 출력에 색을 추가하는 더 일반적인 해결책을 알고 싶습니다.

----

4 개의 답변 중 1개의 답변만 추려냄.

~/.gitconfig 파일에서 [color] 섹션을 생성합니다. 예를 들면 다음처럼 하실 수 있습니다.

[color]
  diff = auto
  status = auto
  branch = auto
  interactive = auto
  ui = true
  pager = true
또한, 어떤 부분에 색을 입히길 원하는 지도 제어하실 수 있습니다. 예를 들면,
[color "status"]
  added = green
  changed = red bold
  untracked = magenta bold

[color "branch"]
  remote = yellow
이를 통해 시작하시길 바랍니다. 당연히 색 입히는 걸 지원하는 터미널이 필요할 것입니다.


반응형
반응형

출처 

http://stackoverflow.com/questions/13040958/merge-two-git-repositories-without-breaking-file-history

파일 히스토리를 없애지 않고 두 개의 Git 저장소를 합치는 방법?

저는 2개의 Git 저장소를 새로운 3번째 저장소로 합치고 싶습니다. subtree 합치기를 사용하는 방법에 대한 많은 글을 찾았고(예를 들어, 어떻게 2개의 git 저장소를 합칩니까? 에 대한 Jakub Narebski의 답변) 이전 보관소로부터 모든 파일을 서브트리로 합치는 commit을 할 때를 제외하고 새로 추가된 파일들은 기록됩니다. 다음 명령어들은 대부분 작동합니다. git log 할 때 이전 저장소로부터 commit 히스토리를 볼 수 있지만 git log <file> 하면 subtree 합치기를 한 그 파일에 대한 하나의 commit만 보여줍니다. 위의 답변에 달란 댓글로 판단하였을 때 이러한 문제를 겪은게 저 혼자만은 아닌듯 보이며 이에 대해 게시된 해결책을 발견하지 못하였습니다.

저장소들을 합치고 각 파일의 히스토리를 남기는 방법이 있을까요?

----

4 개의 답변 중 1개의 답변만 추려냄.

여기에 히스토리를 다시 쓰지 않고 모든 commit  ID들이 유효하게 남아있게 하는 방법이 있습니다. 마지막 결과는 서브디렉터리에 두 번째 저장소 파일들이 있게 됩니다.

1. remote로 두 번째 저장소를 추가합니다.

cd firstgitrepo/
git remote add secondrepo username@servername:andsoon

2. 두 번째 저장소의 모든 커밋을 확실하게 다운 받습니다.

git fetch secondrepo

3. 두 번째 저장소로부터 지역 브랜치를 생성합니다.

git branch branchfromsecondrepo secondrepo/master

4. 서브디렉터리로 두 번째 저장소의 모든 파일을 이동시킵니다.

git checkout branchfromsecondrepo
mkdir subdir/
git ls-tree -z --name-only HEAD | xargs -0 -I {} git mv {} subdir/
git commit -m "Moved files to subdir/"

5. 첫 번째 master(마스터) 브랜치로 두 번째 브랜치를 합칩니다.

git checkout master
git merge branchfromsecondrepo

당신의 저장소는 하나의 root commit 이상 가지겠지만 문제가 되지는 않을 것입니다. 


반응형
반응형

출처 : http://git-scm.com/docs/git-log

이름

git-log - commit log를 보여줍니다.

요약

git log [<옵션들> [revision range] [[\--] <경로>...]

설명

commit log를 보여줍니다.

주어진 commit에서 부모(parent) 링크를 따라 도달할 수 있는 commit을 나열하지만 앞에 ^가 있는 commit에서 도달 가능한 commit은 제외합니다. 출력은 기본적으로 시간 역순으로 제공됩니다.

이것을 집합 연산으로 생각할 수 있습니다. 명령줄에 지정된 commit에서 도달할 수 있는 commit은 집합을 형성한 다음 앞에 ^가 표시된 커밋에서 도달할 수 있는 커밋을 해당 집합에서 뺍니다. 나머지 커밋은 명령의 출력으로 나오는 것입니다. 다양한 기타 옵션 및 경로 매개변수를 사용하여 결과를 추가로 제한할 수 있습니다.

다음 명령이 이 예시입니다.

$ git log foo bar ^baz

위 명령어는 "foo 또는 bar에서는 도달할 수 있지만 baz에서는 도달할 수 없는 모든 커밋을 나열"을 의미합니다.

특수 표기법 ".."는 "^ "의 약어로 사용할 수 있습니다. 예를 들어 다음 중 하나를 서로 바꿔서 사용할 수 있습니다.

$ git log A B --not $(git merge-base --all A B)
$ git log A...B

이 명령은 git-rev-list[1] 명령에 적용 가능한 옵션을 사용하여 표시되는 내용과 방법을 제어하고 git-diff[1] 명령에 적용 가능한 옵션을 사용하여 각 이 도입하는 변경 사항이 표시되는 방법을 제어합니다.

옵션

--follow

이름 변경을 포함하여 하나의 파일의 history(히스토리)를 조회합니다. (하나의 파일에 대해서만 작동합니다.)

예시)

[root@test test]#  git log --follow --oneline ab.txt
1f61b72 second commit      // a.txt ==이름변경==> ab.txt 
00f7289 test - initial commit // a.txt

--all

<commit>의 명령어에 대하여 refs/의 모든 the refs(참조들) 출력될 것입니다.

--no-decorate

--decorate[=short|full|no]

commit의 the ref(참조) 이름을 출력합니다. short이면 the ref(참조) 이름의 접두사 refs/heads/, refs/tags/, refs/remotes는 출력되지 않을 것입니다. full이면 the ref(접두어를 포함하여)의 전체 참조가 출력될 것입니다. 기본 값은 short입니다.

--graph

출력의 왼쪽 부분에 commit history(커밋 히스토리)를 텍스트 기반의 그래픽 표현으로 그립니다.

이는 그래프 history를 적절히 그리기 위해 commit들 사이에 부가적인 행(line)이 있을 수 있습니다.

--no-walk와 결합해서 사용할 수 없습니다.

이는 기본으로 --topo-order 옵션을 내포하지만, --date-order 옵션도 지정될 수 있습니다.

예시)

 [root@test test]# git log --all --graph --oneline --decorate
* 303c84e (HEAD, dev) test dev - 3
* e0de443 test dev - 2
* dd60246 (master) test master - 1
반응형
반응형

출처 : http://bitflop.com/tutorials/how-to-create-a-new-and-empty-branch-in-git.html

Git에서 새롭고 비어 있는 branch를 만드는 방법

많은 코딩 프로젝트에서 코드는 하나의 저장소에 있고 문서는 다른 저장소에 있습니다.

만약 프로젝트가 데이터베이스를 backend로 사용하는 웹 어플리케이션이면 SQL의 백업은 다른 저장소에 있을 것입니다.

Git에서는 하나의 저장소에 모든 것을 가지고 있을 수 있고 branch로 이것들을 분리할 수 있습니다.

보통 branch들은 디렉터리에서 파일을 공유하지만 Git에서는 빈 branch들을 만들 수 있습니다.

당신은 다음처럼 빈 branch를 만들 수 있습니다.

$ git checkout --orphan NEWBRANCH

--orphan 은 새로운 branch를 만드는 데 어떤 commit도 없이 시작합니다. 위의 명령을 실행하면 당신은 새로 만든 "NEWBRANCH" branch에서 작업중에 있는 상태가 됩니다. 이 상태에서 첫 번째 commit을 생성하면 조상이 없는 새로운 history로 시작하게 됩니다.

--orphan 명령은 원래 branch와 비슷한 새로운 history 트리를 생성하는 데 편리하도록 하기 위해 인덱스와 working tree 파일들이 영향을 받지 않도록 합니다.

당신은 원래 branch에서 아무 것도 하지 않은 새롭고 비어 있는 branch를 생성하기를 원하기 때문에, 새로운 작업 디렉터리에서 모든 파일을 삭제할 수 있습니다.

$ git rm -rf .

이제 당신은 파일들을 추가하기 시작하고 commit함으로써 자체 branch에 있을 수 있게 합니다. 만약 commit 로그를 본다면, 원래 log와 분리된 commit log를 보게 될 것입니다.

checkout 명령을 사용하여 원래 branch로 돌아가거나 다른 branch로 이동이 가능합니다.

$ git checkout master ( master branch로 돌아가기 )

$ git checkout NEWBRANCH ( 새롭게 분리된 branch로 돌아가기 )

당신은 --orphan 옵션을 사용하려면 git 1.7.2 이상의 버젼이 필요합니다.

궁금하신 점이나 수정사항이 있으시면 댓글을 남겨 주세요.


반응형
반응형

출처 : http://stackoverflow.com/questions/1282639/switch-git-branch-without-files-checkout

Git: 파일 checkout 없이 git branch 변경하기

= working area 변경 없이 git branch 변경하기

git에서 모든 파일을 checkout하지 않고 다른 브랜치로 변경하는 것이 가능한가요? 저는 branch를 변경한 후 모든 파일을 삭제하고 재 생성한뒤 commit하고 원래 branch를 다시 되돌렸습니다. 그리고 파일을 checkout하는데 시간이 너무 많이 걸립니다. (14000개 정도 파일이 있고 오래 걸립니다.)

분명히 하기 위해:

저는 github에 문서를 업로드 하였습니다.

저는 gh-pages branch를 가진 보관소(repository)가 있습니다. 저는 로컬 컴퓨터에서 문서를 재생성하여 그 파일들을 보관소 디렉터리에 복사하고 commit하고 github에 push하였습니다. 하지만 저는 로컬 컴퓨터에 문서의 복사본이 2개가 있기 때문에 내키지는 않습니다. 그리고 저는 'empty' branch를 만들기로 하고 'empty' 브랜치로 이동한 뒤 파일을 모두 삭제하였습니다. 하지만 원래 branch로 되돌아 오는데 오래 걸립니다. 그래서 이 질문을 합니다.

저는 gh-pages branch는 남기고 파일을 지울 수 있는 방법을 알고 싶지만 dirty working tree들을 남기고 싶지는 않습니다.

----

7 개의 답변 중 1개의 답변만 추려냄.

옙. 다음처럼 하시면 됩니다.

git symbolic-ref HEAD refs/heads/otherbranch
역자 주 : otherbranch는 변경하고자 하는 branch명입니다.

만약 이 branch로 commit할 필요가 있다면 해당 index를 리셋하길 원하시면 다음처럼 하시면 됩니다. 그렇지 않으면 마지막에 checkout된 branch를 기반으로 commit하여 마무리하시면 됩니다.
git reset


반응형

'Git' 카테고리의 다른 글

git log  (0) 2015.08.31
Git에서 새롭고 비어 있는 branch를 만드는 방법  (0) 2015.07.17
잃어버린 commit들 복구하기.  (0) 2015.01.22
Git: branch 포인터를 특정 commit으로 이동하게 하기.  (0) 2015.01.14
git config  (2) 2014.11.14

+ Recent posts