초보자를위한 Git : 확실한 실용 가이드


854

좋아, PJ Hyett 의이 게시물을 본 후 , 나는 끝으로 건너 뛰고 Git 과 함께 가기로 결정했습니다 .

그래서 내가 필요한 것은 초보자의 실제 Git 가이드입니다. "초보자"는 컴파일러를 처리하는 방법을 알고 있고, Makefile 이 무엇인지 어느 정도 이해 하고 있으며, 소스 제어를 잘 이해하지 못한 채 소스 제어에 영향을 준 사람으로 정의됩니다 .

이 사람으로 정의되는 "실용적"은 Git이 백그라운드에서 무엇을하고 있는지에 대해 자세하게 설명하고 싶지 않으며, 배포 된 것을 신경 쓰거나 아는 것도 아닙니다. 귀하의 답변은 가능성을 암시 할 수 있지만 백업 및 보안이 유지되는 '서버'에 '기본'리포지토리를 유지하고 로컬 리포지토리를 '클라이언트'리소스로 취급하려는 초보자를 목표로하십시오.

그래서:

설치 / 설정

코드 작업

태깅, 분기, 릴리스, 기준선

다른

  • Git을 명령 줄이 아닌 리소스로 만드는 좋은 GUI, IDE 플러그인 등을 설명하고 연결하십시오. 그러나 제한 사항과 장점을 나열하십시오.
    • msysgit- 크로스 플랫폼, Git에 포함
    • gitk -Git에 포함 된 크로스 플랫폼 히스토리 뷰어
    • gitnub- 맥 OS X
    • gitx -Mac OS X 히스토리 뷰어
    • smartgit- 크로스 플랫폼, 상업용, 베타
    • tig -Linux 용 콘솔 GUI
    • qgit -Windows, Linux 용 GUI
    • Git Extensions -Windows 용 패키지, 친숙한 GUI 포함
  • 초보자가 알아야 할 다른 일반적인 작업은 무엇입니까?
  • 소스 제어 소스로 서브 버전 저장소 세트를 효과적으로 사용하려면 어떻게해야합니까?

다른 Git 초보자 참조

힘내로 탐구

나는 항목을 수시로 살펴보고 '정돈'하여 일관된 모양과 느낌을 가지며 목록을 쉽게 검색 할 수 있습니다. 간단한 "헤더-간단한 설명-지침 목록-주의 사항" 추가 정보 "템플릿. 또한 위의 글 머리 기호 목록에있는 항목에 연결하여 나중에 쉽게 찾을 수 있습니다.

답변:


118

새로운 프로젝트 / 리포지토리를 어떻게 생성합니까?

자식 저장소는 단순히 특별한 .git디렉토리를 포함하는 디렉토리입니다.

이는 "리포지토리"가 원격 서버에서 호스팅되는 "중앙 버전"버전 제어 시스템 (예 : 서브 버전)과는 달리 checkout"작업 복사본"디렉토리에 있습니다. git을 사용하면 작업 복사본 저장소입니다.

git init추적하려는 파일이있는 디렉토리에서 실행 하십시오.

예를 들어

cd ~/code/project001/
git init

.git현재 디렉토리에 (숨겨진) 폴더가 생성 됩니다.

새 프로젝트를 만들려면 git init추가 인수 (작성할 디렉토리 이름)로 실행하십시오.

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)

현재 현재 경로가 git 저장소 내에 있는지 확인하려면 간단히 실행 git status하십시오. 저장소가 아닌 경우 "치명적 : git 저장소 아님"을보고합니다.

.git디렉토리를 나열 하고 다음과 유사한 파일 / 디렉토리가 포함되어 있는지 확인할 수도 있습니다.

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/

어떤 이유로 든 리포지토리를 "디-디트 (de-git)"하려는 경우 (git 프로젝트 사용을 중지하고 싶을 때) .git저장소의 기본 레벨에서 디렉토리를 제거하십시오 .

cd ~/code/project001/
rm -rf .git/

주의 : 이것은 모든 개정 내역, 모든 태그, git이 수행 한 모든 것을 파괴 합니다 . "현재"파일 (현재 볼 수있는 파일)을 건드리지 않지만 이전 변경, 삭제 된 파일 등은 복구 할 수 없습니다!


3
Git은 객체를 읽기 전용으로 설정하므로 rm -rf .gitgit의 데이터베이스를 없애고 싶을 것이다 .
Josh Lee

일반적으로 .gitignore 파일은 일반 사용 중에 버전 관리에서 무시할 파일 / 트리를 지정하기 위해 작성해야하므로 .git를 제거하는 것 외에도 .git를 제거하는 것 외에도 .git을 제거해야합니다. gitignore 파일. :)
Monoman

베어 리포지토리는 어떻습니까? 그것들은 어떻게 든 "중앙 집중식"이며, 일종의 중앙 집중화가 필요한 많은 프로젝트 (예 : 많은 사람들이 개발 한 프로젝트)에 좋은 것이라고 생각합니다.
peoro

WRT git status가 저장소 내에 있는지 확인하기 위해 실행 중입니다. 여기에는 하나의 문제가 있습니다. 현재 쉘에 환경 변수 $ GIT_DIR이 설정되어 있으면 git은 현재 위치를 무시하고 $ GIT_DIR의 저장소를 사용합니다. 나는 어제 그 시간을 잃었다는 것을 알아야한다.
sanmiguel

110

자식 용 GUI


힘내 GUI

git에 포함 — git gui명령 줄에서 실행 하면 Windows msysgit 설치 관리자가이를 시작 메뉴에 추가합니다.

Git GUI는 git과 관련된 대부분의 작업을 수행 할 수 있습니다. 스테이지 변경 포함, git 및 저장소 구성, 변경 푸시, 브랜치 생성 / 체크 아웃 / 삭제, 병합 및 기타 여러 가지 사항.

내가 가장 좋아하는 기능 중 하나는 마우스 오른쪽 버튼 클릭 메뉴의 "스테이지 라인"및 "스테이지 행크"바로 가기이며 파일의 특정 부분을 커밋 할 수 있습니다. 을 통해 동일한 결과를 얻을 수 git add -i있지만 사용하기가 더 쉽다는 것을 알았습니다.

가장 예쁜 응용 프로그램은 아니지만 거의 모든 플랫폼에서 작동합니다 (Tcl / Tk 기반).

스크린 샷 | 스크린 캐스트


GitK

자식도 포함되어 있습니다. git history viewer이며 저장소의 히스토리 (브랜치, 생성 및 병합시 포함)를 시각화 할 수 있습니다. 커밋을보고 검색 할 수 있습니다.

git-gui와 잘 어울립니다.


tn 투브

Mac OS X 응용 프로그램 주로와 동일 git log하지만 "네트워크보기"와 같이 github 과 일부 통합되어 있습니다.

예쁘고 Mac OS X에 적합합니다. 리포지토리를 검색 할 수 있습니다. Gitnub의 가장 큰 범죄는 역사를 선형 방식 (한 번에 단일 분기)으로 표시한다는 것입니다. 분기 및 병합을 시각화하지는 않지만 git에서 중요 할 수 있지만 계획된 개선 사항입니다.

링크 다운로드, 변경 로그 및 스크린 샷 | Git 저장소


GitX

"OS X 용 gitk clone"으로되어 있습니다.

비선형 브랜치 히스토리를 시각화하고, 커밋을 수행하고, 커밋을보고 검색 할 수 있으며, 어떤 수정본에서든 (빠른보기) 파일 (파일 목록보기에서 누르기), 파일 내보내기와 같은 다른 멋진 기능이 있습니다. (드래그 앤 드롭을 통해).

git-gui/ 보다 OS X에 훨씬 잘 통합되어 gitk있으며, 매우 큰 리포지토리에서도 빠르고 안정적입니다.

원래 git 저장소 pieter 는 최근에 (작성 시점에서 1 년 이상) 업데이트되지 않았습니다. 더 적극적으로 유지 관리되는 브랜치는 Brotherbard / gitx 에서 사용할 수 있습니다. "사이드 바, 페치, 풀, 푸시, 원격 추가, 병합, 체리 픽, 리베이스, 복제, 복제"를 추가합니다.

다운로드 | 스크린 샷 | 자식 저장소 | 형제 포크 | 라울 론 포크


SmartGit

홈페이지에서 :

SmartGit은 분산 버전 제어 시스템 Git의 프론트 엔드이며 Windows, Mac OS X 및 Linux에서 실행됩니다. SmartGit은 명령 줄 클라이언트보다 그래픽 사용자 인터페이스를 선호하는 개발자를 위해 만들어졌으며 오늘날 가장 강력한 DVCS 인 Git을 사용하여 생산성을 높일 수 있습니다.

웹 사이트 에서 다운로드 할 수 있습니다 .

다운로드


거북이

Windows 사용자를위한 TortoiseSVN Git 버전.

TortoiseSVN을 TortoiseGit으로 포팅하는 중입니다. 최신 릴리스 1.2.1.0이 릴리스는 커밋, 표시 로그, 두 가지 버전 차이점, 분기 및 태그 생성, 패치 생성 등과 같은 일반 작업을 완료 할 수 있습니다. 자세한 내용은 릴리스 노트 를 참조하십시오 . 이 프로젝트에 오신 것을 환영합니다.

다운로드


QGit

QGit은 Qt / C ++를 기반으로하는 git GUI 뷰어입니다.

qgit을 사용하면 다른 개발 브랜치를 따라 그래픽으로 히스토리 히스토리를 탐색하고 패치 컨텐츠 및 변경된 파일을 볼 수 있습니다.

다운로드


gitg는 gtk + / GNOME을 대상으로하는 git 저장소 뷰어입니다. 주요 목표 중 하나는 여러 데스크톱에서 git 프론트 엔드에보다 통일 된 사용자 경험을 제공하는 것입니다. 크로스 플랫폼 애플리케이션을 작성하는 것이 아니라 다른 운영 체제 (예 : OS X 용 GitX)의 유사한 클라이언트와 긴밀한 협업을 통해 작성합니다.

풍모

  • 개정 내역을 찾아보십시오.
  • 큰 리포지토리를 처리합니다 (리눅스 리포지토리, 17000+ 개정판, 1 초 미만).
  • 변경 사항을 커밋하십시오.
  • 개별 덩어리를 스테이지 / 언 스테이지하십시오.
  • 변경 사항을 되돌립니다.
  • 수정 된 부분의 색상 차이를 표시합니다.
  • 지정된 개정판의 트리를 찾아보십시오.
  • 지정된 개정의 트리 부분을 내 보냅니다.
  • 'git log'와 같은 명령이 히스토리를 빌드하기 위해 이해할 수있는 모든 참조 스펙을 제공하십시오.
  • 히스토리보기에서 분기를 표시하고 전환하십시오.

다운로드 : 릴리스 또는 소스


깃 박스

Gitbox는 Git 버전 제어 시스템을위한 Mac OS X 그래픽 인터페이스입니다. 단일 창에서 분기, 히스토리 및 작업 디렉토리 상태가 표시됩니다.

확인란을 사용하여 스테이지 및 언 스테이지 변경을 수행 할 수 있습니다. 한 번의 클릭으로 커밋, 풀, 병합 및 푸시 FileMerge.app에서 diff를 표시하려면 변경 사항을 두 번 클릭하십시오.

다운로드


동정

Gity 웹 사이트에는 많은 정보가 없지만 스크린 샷에서 기능이 풍부한 오픈 소스 OS X git gui 인 것처럼 보입니다.

다운로드 또는 소스


용융

Meld는 시각적 차이 및 병합 도구입니다. 두세 개의 파일을 비교하여 제자리에서 편집 할 수 있습니다 (차동 업데이트). 두세 개의 폴더를 비교하고 파일 비교를 시작할 수 있습니다. CVS, Subversion, Bazaar-ng 및 Mercurial [ 및 Git ] 과 같은 널리 사용되는 버전 제어 시스템에서 작업 사본을 찾아보고 볼 수 있습니다 .

다운로드


카타나

Steve Dekorte의 OSX를위한 Git GUI.

한눈에, 어떤 원격 브랜치가 풀로 변경되고 로컬 리포지토리가 푸시로 변경되는지 확인하십시오. 추가, 커밋, 푸시, 풀, 태그 및 리셋의 git ops가 지원되며 로컬 변경 사항 및 추가 사항을 강조 표시하는 프로젝트 계층의 시각적 차이 및 시각적 탐색이 지원됩니다.

1 개의 저장소에 무료, 25 달러 이상.

다운로드


새싹 (이전 GitMac)

Git을 사용하기 쉽게 만드는 데 중점을 둡니다. 기본 Cocoa (mac-like) UI, 빠른 리포지토리 탐색, 복제, 푸시 / 풀, 분기 / 병합, 시각적 차이, 원격 분기, 터미널에 대한 쉬운 액세스 등을 제공합니다.

가장 일반적으로 사용되는 Git 작업을 직관적이고 쉽게 수행 할 수 있도록 Sprout (이전의 GitMac)는 Git을 사용자에게 친숙하게 만듭니다. 대부분의 Git 워크 플로와 호환되는 Sprout는 디자이너와 개발자, 팀 공동 작업 및 고급 및 초보 사용자 모두에게 적합합니다.

다운로드 | 웹 사이트


Mac OSX 용 기능이 풍부한 Git GUI. 30 일 무료 평가판, 단일 사용자 라이센스의 경우 $ 59USD.

다운로드 | 웹 사이트


EGit

EGit은 Git 버전 제어 시스템을위한 Eclipse 팀 제공 업체입니다. Git은 분산 SCM이므로 모든 개발자가 코드의 모든 개정판에 대한 모든 히스토리의 전체 사본을 가지고 있으므로 히스토리에 대한 쿼리를 매우 빠르고 다재다능하게합니다.

EGit 프로젝트는 Git의 JGit Java 구현 위에 Eclipse 툴링을 구현하고 있습니다.

다운로드 | 웹 사이트


힘내 확장

Windows 용 오픈 소스-사용하기 쉬운 단일 패키지로 Git에 필요한 모든 것을 설치합니다.

Git Extensions는 Windows에서 Git을보다 직관적으로 사용하기위한 툴킷입니다. 셸 확장은 Windows 탐색기에서 통합되며 파일 및 디렉토리에 대한 상황에 맞는 메뉴를 제공합니다. Visual Studio에서 git을 사용하는 Visual Studio 플러그인도 있습니다.

다운로드

git gui에 대해 설명해 주신 dbr 에게 감사드립니다 .


소스 트리

SourceTree는 Git, Mercurial 및 SVN을위한 무료 Mac 클라이언트입니다. BitBucket 뒤에있는 Atlassian이 만든 모든 VC 시스템과 똑같이 잘 작동하는 것처럼 보이므로 모든 프로젝트에서 사용할 수있는 단일 도구를 마스터 할 수는 있지만 버전이 제어됩니다. 기능이 풍부하고 무료입니다.

초보자와 고급 사용자 모두를위한 전문가 준비 및 기능 제공 :

발신 및 수신 변경 세트를 검토합니다. 가지 사이의 체리 픽. 패치 처리, 리베이스, 숨김 / 선반 등.

다운로드 | 웹 사이트



2
좋은 답변 (특히 gitcast 및 push / pull 답변)이 있지만 별도의 답변으로 나누는 것이 좋습니다. 질문자는 "대량의 정보를 하나의 답변에 넣지 마십시오"라고 요청했습니다!
dbr

3
어쩌면 Windows 거터의 경우 TortoiseGit code.google.com/p/tortoisegit 를 목록에 추가해야합니다 .
kret

1
Gity ( macendeavor.com/gity )는 옵션이지만 아직 개발 중입니다 (OS X)
Dave DeLong

2
Tower ( "Mac 용 가장 강력한 Git 클라이언트")는 Git의 새롭고 아름다운 클라이언트입니다.
rubiii

59

글쎄, 당신이 우리가 다른 자원과 "간단하게"링크하지 않겠다고 요청 했음에도 불구하고, 실제로 아주 좋은 공동체가 자라고있는 자원이 이미 있다면 그것은 어리석은 일입니다 : Git Community Book . 진지하게, 질문에서이 20 개 이상의 질문은 간결하고 일관된 것이 될 것입니다. Git 커뮤니티 북은 HTML과 PDF로 제공되며 명확하고 형식이 잘 잡힌 동료 검토 답변과 함께 문제에 바로 이동할 수있는 형식으로 많은 질문에 답변합니다.

아아, 내 게시물이 실제로 당신을 화나게하면 삭제하겠습니다. 그렇게 말해


2
DVCS이기 때문에 git을 사용하지 않는다면 왜 git을 전혀 사용하지 않습니까? 이 질문은 어리석은 것이며 의심스러운 목표를 달성하기 위해 다른 것들에 사용될 수있는 자원을 바꾼다.
Randal Schwartz

56

파일을 무시하도록 구성하는 방법 :

git이 추적하고 싶지 않은 파일을 무시하도록하는 기능은 매우 유용합니다.

파일 또는 파일 세트를 무시하려면 패턴을 제공하십시오. git의 패턴 구문은 매우 간단하지만 강력합니다. 아래에 언급 할 세 가지 파일 모두에 적용됩니다.

  • 빈 줄은 파일을 무시하지 않으며 일반적으로 구분 기호로 사용됩니다.
  • #으로 표시된 줄 은 주석 역할을합니다.
  • ! 접두어는 선택 사항이며 패턴을 무효화합니다. 일치하는 부정 패턴은 우선 순위가 낮은 패턴보다 우선합니다.
  • 고급 표현 및 와일드 카드 지원
    • 예 : 패턴 : *. [oa] 는 저장소에서 .o 또는 .a로 끝나는 모든 파일 (개체 및 아카이브 파일)을 무시합니다.
  • 패턴에 슬래시 git로 끝나는 디렉토리가 있으면이 디렉토리와 그 아래 경로 만 일치합니다. 일치하는 일반 파일과 심볼릭 링크는 제외됩니다.
  • 선행 슬래시는 해당 경로 이름의 모든 파일과 일치합니다.
    • 예 : /*.c 패턴 은 foo.c 파일과 일치 하지만 bar / awesome.c 와는 일치 하지 않습니다.

gitignore (5) 매뉴얼 페이지 의 훌륭한 예 :

$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
  # ignore objects and archives, anywhere in the tree.
  *.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

일반적으로 추적되지 않은 파일을 무시하는 세 가지 방법이 있습니다.

1) 저장소의 모든 사용자를 무시하십시오.

.gitignore 라는 파일을 작업 복사본의 루트에 추가하십시오.

.gitignore 를 편집 하여 파일을 무시해서는 안되는 환경 설정과 일치시킵니다.

git add .gitignore 

완료되면 커밋하십시오.

2) 저장소 사본 만 무시하십시오.

선호하는 패턴으로 작업 복사본에 $ GIT_DIR / info / exclude 파일을 추가 / 편집하십시오 .

예 : 내 작업 복사본은 ~ / src / project1이므로 ~ / src / project1 / .git / info / exclude를 편집합니다.

끝났습니다!

3) 시스템의 모든 상황에서 무시하십시오.

시스템의 전역 무시 패턴은 원하는 파일로 이동할 수 있습니다.

개인적으로 ~ / .gitglobalignore 라고합니다.

그런 다음 ~ / .gitconfig 파일을 다음 줄로 편집하여 git 에게이 파일을 알릴 수 있습니다 .

core.excludesfile = ~/.gitglobalignore

끝났습니다!

자세한 내용 은 gitignore 매뉴얼 페이지가 최상의 리소스 라는 것을 알았습니다 .


누군가이 게시물에 사소하지만 중요한 세부 사항 하나를 추가 할 수 있습니까? 이것은 아직 git에 의해 추적되지 않은 파일에 대해서만 작동합니다. 파일을 '트래킹 해제'하지만 파일 시스템에 그대로 두려면 'git rm --cached filename'이 필요합니다. 감사!
Nikita Rybak

core.excludesfile 줄을 추가해도 효과가 없다는 것을 알고 싶습니다. 작동하려면 [git config --global core.excludesfile ~ / .gitglobalignore]가 필요했습니다.
코딩 지구

Github에 gitignore라는 프로젝트가 있는데,이 언어는 다양한 언어 및 개발 환경을위한 gitignore 파일을 가지고 있습니다 : github.com/github/gitignore
Ryan Lundy

47

특정 개정 세트에 '태그'하는 방법

특정 파일 세트에 대해 특정 개정 세트를 '표시'하거나 '릴리스'하는 방법은 언제라도 나중에 가져올 수 있습니까?

git tag명령을 사용합니다 .

현재 개정판에 "태그"를 붙이기 위해 실행하면됩니다.

git tag -a thetagname
git tag -a 0.1
git tag -a 2.6.1-rc1 -m 'Released on 01/02/03'

현재 태그를 나열하려면 git tag인수없이 또는 -l소문자 L로 간단히 실행하십시오 .

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname

태그를 삭제하려면 다음 -d플래그 를 사용하십시오 .

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]

특정 (이전) 커밋에 태그를 지정하려면 간단히 수행하십시오.

git tag [tag name] [revision SHA1 hash]

예를 들면 다음과 같습니다.

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

참고 : 기본적으로 git은 "가벼운"태그 (기본적으로 특정 개정에 대한 참조)를 만듭니다. "올바른"방법은 -a깃발 을 사용하는 것 입니다. 그러면 태그 메시지를 요청하는 편집기가 시작됩니다 (커밋 메시지를 요청하는 것과 동일합니다. -m플래그를 사용 하여 명령 행에서 태그 메시지를 제공 할 수도 있습니다 ). 주석이 달린 태그를 사용하면 고유 한 ID, 날짜, 태거 (작성자) 및 선택적으로 GPG 서명 ( -s태그 사용)을 가진 객체가 생성 됩니다. 이에 대한 자세한 내용은 이 게시물을 참조하십시오.

git tag mytagwithmsg -a -m 'This is a tag, with message'

주석이있는 태그를 나열하려면 -n1플래그를 사용하여 각 태그 메시지의 한 줄 -n245을 표시하십시오 ( 각 주석의 처음 245 줄 등 표시).

$ git tag -l -n1
mytagwithmsg    This is a tag, with message

자세한 내용은 git-tag (1) 매뉴얼 페이지를 참조하십시오.


git 태그 기본적으로 태그를 만들지 않고 간단한 참조 만합니다. 당신도 -a를 사용하거나 (것들을 사용 설명처럼) 태그 객체 생성 -s해야합니다 rockstarprogrammer.org/post/2008/oct/16/...
더스틴

아, 흥미 롭습니다. 덕분에, 나는이를 반영 할 수있는 대답을 업데이 트했습니다
DBR

그리고 이전에 커밋 된 개정판에 태그를 어떻게 추가합니까? (미안 그것은 내가 통해 미끄러 져 내가 뭔가를 그리워했다, 그래서 너무 오래입니까?)
하센

hasen j : 기본적으로 답변 정보 추가git tag tagname revision_SHA1
dbr

1
태그를 원격 저장소로 푸시하려면 git push (github 도움말 영역의 정보)를 사용할 때 --tags를 추가하십시오.
Héctor Ramos

46

GIT를 사용한 워크 플로우 예.

Git은 매우 유연하고 모든 워크 플로우에 적합하지만 특정 워크 플로우를 적용하지 않으면 선형 "백업"워크 플로우를 넘어서 git으로 수행 할 수있는 작업과 이해하기 어려운 분기 등을 이해하는 데 부정적인 영향을 줄 수 있습니다. .

블로그 게시물 은 git을 사용하여 설정하기가 매우 간단하지만 효과적인 워크 플로우를 훌륭하게 설명합니다.

블로그 게시물에서 인용 : 우리는 원산지 / 마스터를 HEAD의 소스 코드가 항상 생산 준비 상태를 반영하는 주요 지점으로 간주합니다.

워크 플로우는이 워크 플로우를 구현하는 프로젝트를 만들 정도로 충분히 대중화되었습니다 : git-flow

모든 변경 사항을 개발하고 코드가 프로덕션 상태 일 때만 마스터하도록 푸시하는 간단한 워크 플로의 멋진 그림입니다.

간단한 워크 플로우

이제 새로운 기능을 사용하거나 모듈을 리팩토링한다고 가정 해 봅시다. 새로운 지점을 만들 수 있습니다. "기능"분기라고 할 수 있습니다. 시간이 걸리고 코드가 손상 될 수 있습니다. 기능이 "안정적"이고 프로덕션에 "더 가깝게"옮기려면 기능 분기를 개발에 병합하십시오. 병합 후 모든 버그가 정렬되고 코드가 모든 테스트를 통과하면 변경 사항을 마스터로 푸시합니다.

이 모든 과정에서 즉시 수정해야하는 끔찍한 보안 버그가 발견됩니다. 핫픽스라고하는 분기가있을 수 있습니다.이 분기는 일반 "개발"분기보다 프로덕션으로 빠르게 변경 사항을 적용합니다.

여기에이 기능 / 핫픽스 / 개발 / 제작 워크 플로가 어떻게 보일지에 대한 그림이 있습니다 (블로그 게시물에 설명되어 있으며, 블로그 게시물은 전체 프로세스를 훨씬 더 상세하고 훨씬 더 잘 설명합니다). .

힘내 워크 플로 예


나는 자식 초보자이며,이 다이어그램은 나를 혼란스럽게 만듭니다 .
finnw

어느 것, 첫 것, 마지막 것? 게시물을 너무 길게 만들고 싶지는 않았지만 나중에 두 다이어그램에 대한 작은 설명을 추가하겠습니다.
ashwoods

전체 기사를 읽으십시오. 나는이 도표에 의해서도 혼란스러워졌지만, 블로그 포스트는 매우 잘 쓰여졌다. nvie.com/posts/a-successful-git-branching-model
Felipe Sabino

지금은 더 나아 졌습니까? 난 단지 전체 개요를 게시하지 말고 대략적인 개요를 제시하고 싶었습니다 :)
ashwoods

39

더 이상 사용할 수 없으므로 PJ Hyett의 게시물 사본은 다음과 같습니다.

힘내는 어렵지 않다

2008 년 11 월 23 일

사람들에게 왜 Subversion을 통해 Subversion을 사용해야하는지 알려 주면“Git은 Subversion보다 Subversion을 더 잘 수행하지만 그보다 훨씬 더 많은 일을합니다”라고 말합니다.

"많은 것"은 Git을 실제로 빛나게하는 많은 것들로 구성되어 있지만 Subversion과 같은 다른 SCM에서 온 사람들에게는 압도적 일 수 있습니다.

즉, 전환하는 동안 Subversion을 사용하는 것처럼 Git을 사용하는 것을 막을 수는 없습니다.

필요한 소프트웨어를 설치하고 어딘가에 원격 저장소가 있다고 가정하면 다음과 같이 코드를 가져 와서 Subversion으로 변경 사항을 푸시합니다.

$ svn checkout svn://foo.googlecode.com/svn/trunk foo
# make your changes
$ svn commit -m "my first commit"

그리고 Git에서 어떻게 할 것입니까?

$ git clone git@github.com:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

Git에서이를 수행하는 명령이 하나 더 있습니다. 이 추가 명령은 큰 의미를 갖지만이 게시물의 목적 상 이것이 우리가 이야기하는 전부입니다. 하나의 추가 명령입니다.

정말 어렵지 않습니다.

업데이트 : 나는 또한 힘내되는 서브 버전의 로컬 복사본을 업데이트하는 것과 비교 언급하지에 태만 것 svn updategit pull각각. 두 경우 모두 하나의 명령입니다.


첫 번째 예에서는 상대 경로를 체크 아웃 ./foo하지만 get 클론에 지정된 경로가 없지만 어디에서 체크 아웃합니까?
JD Isaacks

33

힘내 설치하는 방법

Windows에서 :

msysgit 설치

여러 다운로드가 있습니다 :

  • 힘내 : 아래의 다른 옵션 중 하나가 특별히 필요하지 않으면 사용하십시오.
  • PortableGit : PC에 설치하지 않고 PC에서 Git을 실행하려면 (예 : USB 드라이브에서 Git 실행)이를 사용하십시오.
  • msysGit : Git 자체를 개발하려는 경우 사용하십시오. 당신은 단지에 대한 힘내을 사용하려면 사용자의 소스 코드,하지만 편집하지 않으려는 망할 놈의 소스 코드, 당신이 필요하지 않습니다.

또한 Cygwin bash 쉘을 설치하므로 gitcmd.exe보다 멋진 쉘을 사용할 수 있으며 git-gui ( git gui명령을 통해 액세스 할 수 있음) 또는Start > All Programs > Git 메뉴 합니다

맥 OS X

사용 자식-OSX-설치 , 또는 당신은 또한 소스에서 설치할 수 있습니다

패키지 관리자를 통해

git기본 패키지 관리자를 사용하여 설치 하십시오. 예를 들어, 데비안 (또는 우분투)에서 :

apt-get install git-core

또는 Mac OS를 통해 MacPorts 를 통해 :

sudo port install git-core+bash_completion+doc

… 또는 담근다 :

fink install git

… 또는 Homebrew :

brew install git

Fedora와 같은 Red Hat 기반 배포판 :

yum install git

Cygwin에서 Git 패키지는 "devel"섹션에서 찾을 수 있습니다

소스에서 (Mac OS X / Linux / BSD 등)

Mac OS X에서 개발자 도구가 설치되어 있으면 소스에서 Git을 매우 쉽게 컴파일 할 수 있습니다. 최신 버전의 Git을 a .tar.bz또는 http://git-scm.com/.tar.gz 에서 다운로드하여 압축을 풉니 다 (Finder에서 두 번 클릭).

Linux / BSD / etc에서. 많이 같아야합니다. 예를 들어, 데비안 (및 우분투)에서는을 build-essential통해 패키지를 설치해야합니다 apt.

그런 다음 터미널 cd에서 파일을 추출한 위치 (실행 중) cd ~/Downloads/git*/가 실행됩니다.

./configure && make && sudo make install

이것은 기본 위치 (로 힘내를 설치합니다 /usr/local그래서 - git에있을 것입니다/usr/local/bin/git )

비밀번호 ( sudo) 를 입력하라는 프롬프트 가 표시 /usr/local/됩니다. 이는 "root"사용자 만 액세스 할 수 있는 디렉토리에 쓸 수 있으므로 sudo가 필요합니다!

Git의 파일이 다른 도구와 혼합되어 있지 않은 별도의 위치에 설치하는 --prefix경우 configure 명령을 사용하십시오.

./configure --prefix=/usr/local/gitpath
make
sudo make install

이것은 git바이너리를 설치 /usr/local/bin/gitpath/bin/git하므로 매번 입력 할 필요는 없습니다 $PATH. 다음에 다음 줄을 추가하여 추가해야 합니다 ~/.profile.

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"

sudo 액세스 권한이 없으면 --prefix=/Users/myusername/bin홈 디렉토리를 사용 하여 설치할 수 있습니다 . 추가 ~/bin/해야합니다$PATH

x-git-update-to-latest-version 스크립트 는 다음을 자동화합니다.

이 스크립트는 (및 localY에서 자식의 repo의 내 로컬 복제를 업데이트 ~/work/track/git) 한 다음를 구성하고 설치합니다 (에 /usr/local/git- git describe)와 업데이트 /usr/local/git심볼릭 링크.

이런 식으로, 나는 /usr/local/git/bin내에서 가질 수 있습니다PATH 있고 항상 최신 버전을 사용하고 있습니다.

이 스크립트의 최신 버전은 매뉴얼 페이지도 설치합니다. 디렉토리 MANPATH를 포함 하도록 조정해야 합니다 /usr/local/git/share/man.


5
Fedora에서 : yum install git. GUI를 실행하려면 yum install git-gui.
Cristian Ciupitu

2
Mac에서sudo port install git-core+bash_completion+doc
싱글 톤

Mac 용 fink를 다운로드했지만 fink install git을 실행하면 "실패 : 'git'사양에 대한 패키지를 찾을 수 없습니다!"라는 오류가 발생합니다.
quano 2009

@quano 그것은이 있어야 pdb.finkproject.org/pdb/package.php/git 체크 핑크가 제대로 업데이트됩니다 - - 나는 실행 생각 fink self-update도움이 될 것입니다
DBR

32

힘내 리셋

가져 와서 코드에 병합하고 마음에 들지 않는다고 결정하십시오. git-log 또는 tig를 사용하고 해시를 복사 할 위치 (아마도 풀 / 병합 전에 마지막 커밋)의 해시를 찾으십시오.

# Revert to a previous commit by hash:
git-reset --hard <hash>

해시 대신 HEAD ^ 를 이전 커밋의 바로 가기로 사용할 수 있습니다 .

# Revert to previous commit:
git-reset --hard HEAD^

4
이것은 대부분의 다른 중앙 집중식 버전 제어 시스템에서 되돌리기와 유사합니다.
Jeremy Wall

"$ git-reset --hard HEAD ^"는 부모의 부모 (즉, 마지막 커밋 이전의 이전 상태)의 약어입니다.
Ben Page

6
평범한 옛 사람 git reset은 우연히 무대에서 벗어나야한다git add
slf

31

공유 팀 저장소는 어떻게 설정합니까?

여기에 일반 리포지토리 를 설정하는 방법 이 설명되어 있지만 모든 사람이 끌어 올 수있는 팀 리포지토리를 어떻게 설정합니까?

공유 NFS 파일 시스템 사용

예를 들어 팀에 이미 사용할 수있는 공유 그룹 멤버십이 있다고 가정하십시오.

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared

이 저장소를 사용하려면 가장 쉬운 방법은 이미 사용중인 로컬 저장소에서 시작하는 것입니다.

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master

다른 사람들은 이제 이것을 복제하고 작업을 시작할 수 있습니다.

cd your/local/workspace
git clone /your/share/folder/project.git

SSH 사용

대상 서버에서 사용자 계정을 설정하십시오. 암호가없는 계정을 사용하든 암호를 사용하는 계정을 사용하든 사용하든 authorized_keys실제로 필요한 보안 수준에 따라 다릅니다. SSH를 통한 Git 구성 살펴보기 좀 더 많은 정보를.

모든 개발자가이 공유 저장소에 액세스하기 위해 동일한 계정을 사용하는 경우 --shared 위와 같은 옵션 .

위와 같은 방법으로 리포지토리를 초기화 한 후 다음과 같이 초기 푸시를 수행합니다.

cd your/local/workspace/project
git remote add origin user@server:/path/to/project.git
git push origin master

위와의 유사성을 보시겠습니까? 또한 계정에 비밀번호가있는 경우 SSH를 사용하여 비밀번호를 묻는 것이 추가로 발생할 수 있습니다. 비밀번호가없는 계정에서이 프롬프트가 표시되면 SSH 서버가 비활성화되었을 수 있습니다.PermitEmptyPasswords 입니다.

복제는 이제 다음과 같습니다.

cd your/local/workspace
git clone user@server:/path/to/project.git

NFS 외에-ssh를 통해 작동하도록 git 서버를 어떻게 설정합니까? -github.com의 소규모 인스턴스처럼?
Dafydd Rees 2016 년

관련 디렉토리에 그룹 고정 비트 세트가 필요합니까, 또는 git이 모든 것을 처리합니까? 후자의 경우 git은 Unix 파일의 권한에 사용할 그룹을 어떻게 알 수 있습니까?
노먼 램지

요청에 따라 SSH 섹션을 추가했습니다. 모든 개발자가 공유 그룹을 기본 그룹으로 사용하지 않는 경우 고정 비트가 필요합니다. 기본 그룹이 다른 사용자가있는 경우 기본적으로이 그룹 소유권을 가진 파일을 만듭니다. 이것은 git 아래에서 발생하므로 항상 git의 제어 범위 내에 있지는 않습니다.
Asgeir S. Nilsen 2016

어떤 git repo-config core.sharedRepository 그룹 이 유용합니까?
systempuntoout

28

git status당신의 친구입니다, 그것을 자주 사용하십시오. 다음과 같은 질문에 답하기에 좋습니다 :

  • 그 명령은 무엇을 했습니까?
  • 어떤 지점에 있습니까?
  • 나는 어떤 변화를 저지르고 잊어 버렸습니까?
  • 내가이 프로젝트에서 일한 마지막 일 (일, 주 또는 몇 달 전)에 있었습니까?

말과는 달리 svn status, git status거의-즉시 심지어 대형 프로젝트에 실행됩니다. 나는 자주 사용하는 git을 배우면서 안심하고 있다는 것을 알았습니다. 이제는 주로 마지막 커밋 이후 변경된 내용을 상기시키기 위해 사용합니다.

.gitignore가 제대로 구성되어 있으면 훨씬 더 유용합니다.


27

커밋 변경

파일을 편집 한 후에는 변경 사항을 git에 커밋해야합니다. 이 명령을 실행하면 커밋 메시지가 표시됩니다. 커밋 메시지는 변경 내용을 모든 사람에게 알려주는 단순한 텍스트입니다.

$ git commit source/main.c

./source/ 디렉토리에서 main.c 파일을 커밋합니다.

$ git commit -a # the -a flag pulls in all modified files

변경된 모든 파일을 커밋합니다 (그러나 새 파일은 아니며 git-add로 인덱스에 추가해야합니다). 특정 파일 만 커밋하려면 먼저 git-add로 파일을 스테이징 한 다음 -a 플래그없이 커밋해야합니다.

커밋하면 원격 리포지토리가 아닌 로컬 리포지토리 만 변경됩니다. 커밋을 원격 저장소로 보내려면 푸시를 수행해야합니다.

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository

CVS 또는 SVN에서 온 사람에게는 중앙 저장소에 대한 커밋에 두 단계가 필요하므로 변경됩니다.


27

어떻게 분기합니까?

자식 저장소의 기본 브랜치는이라고 master합니다.

새 지점을 만들려면

git branch <branch-name>

현재 리포지토리 유형의 모든 분기 목록을 보려면

git branch

다른 지점으로 전환하려면 사용할 수 있습니다

git checkout <branch-name>

새 분기를 만들고 한 단계로 전환하려면

git checkout -b <branch-name>

분기를 삭제하려면

git branch -d <branch-name>

현재 브랜치의 변경 사항으로 브랜치를 만들려면

git stash
git stash branch <branch-name>

11
git checkout -b <branch-name> 바로 가기를 언급하면 ​​분기를 만들고 한 번에 분기로 전환합니다. 초보자 및 고급 git 사용자에게 가장 일반적인 사용 사례 일 것입니다.
Jeremy Wall

21

최신 코드 받기

$ git pull <remote> <branch> # fetches the code and merges it into 
                             # your working directory
$ git fetch <remote> <branch> # fetches the code but does not merge
                              # it into your working directory

$ git pull --tag <remote> <branch> # same as above but fetch tags as well
$ git fetch --tag <remote> <branch> # you get the idea

그것은 원격 저장소에서 최신 코드 사본을 얻는 모든 경우에 적용됩니다.



18

Git Magic 만 있으면됩니다. 보장 또는 돈을 돌려!


14
한숨, 돈을 돌려줘 불완전한 튜토리얼 (GitMagic) == 작업 시간이 거의없는 버그가있는 소프트웨어 (msysGit)
SamGoody

16

지점을 어떻게 병합합니까?

당신이 지점을 병합 할 경우 (예를 들어 master로는 release) 반드시 현재의 지점은 당신이에 병합 (사용하고자하는 대상 지점입니다 만들 git branch거나 git status현재 지점을 볼 수).

그런 다음 사용

git merge master

(여기서 master현재 지점과 병합하려는 지점의 이름입니다).

충돌이 있으면 사용할 수 있습니다

git diff

보류중인 충돌을 확인하려면 해결해야합니다.


2
좋아하는 도구 (gvimdiff, kdiff3 또는 그 이상)로 3 방향 차이를 수행하는 git mergetool이 있습니다.
Dave Vogt



12

원격 지점을 추적하는 방법

로컬 리포지토리를 복제 한 원격 리포지토리가 있다고 가정하고 해당 원격 리포지토리에 'some_branch'라는 브랜치가 있다고 가정하면 로컬로 추적하는 방법은 다음과 같습니다.

# list remote branches
git branch -r

# start tracking one remote branch
git branch --track some_branch origin/some_branch

# change to the branch locally
git checkout some_branch

# make changes and commit them locally
....

# push your changes to the remote repository:
git push

git 1.7에서는 원격 지점을 로컬 지점에서 만들 때 원격 지점이 자동으로 추적되는 것으로 보입니다. 이 동작이 시작된 버전을 모르겠습니다.
Doppelganger

실제로 다음을 사용하여 모든 원격 지사를 나열 할 수 있습니다.git remote show REMOTENAME
Felipe Sabino


10

파일의 두 개정판 또는 현재 파일과 이전 개정판을 어떻게 비교합니까?

비교 명령은 git diff 입니다.

파일의 두 개정판을 비교하려면 다음을 수행하십시오.

$ git diff <commit1> <commit2> <file_name>

이것은 commit1을 commit2와 비교합니다. 순서를 변경하면 파일이 다른 방식으로 차이가 나므로 예상과 다릅니다.

현재 준비된 파일을 저장소와 비교하려면 다음을 수행하십시오.

$ git diff --staged <file_name>

현재 스테이지되지 않은 파일을 저장소와 비교하려면 다음을 수행하십시오.

$ git diff <file_name>

9

왜 또 다른 하우투? 시작하기에 완벽한 git guide 와 같이 인터넷에는 정말 좋은 것들이 있습니다 . git book을 포함한 좋은 링크가 있습니다. 을 (git hub에서 호스팅) 을 공동 작업에 완벽합니다.

stackoverflow에서, 나는 정말 좋아하는 트릭을보고 싶습니다!

내가 최근에 발견 한 광산은 여기git stash설명 되어있어 현재 작업을 저장하고 다른 지점으로 이동할 수 있습니다

편집 : 이전 게시물로, 위키로 게시물이있는 스택 오버 형식을 선호하는 경우이 답변을 삭제합니다.


아니요, 삭제하지 마십시오. 당신의 대답은 완벽하게 유효하며 다른 사람들에게 좋은 자원을 가리키는 것은 나쁜 일이 아닙니다. 여기에 나열된 가장 일반적인 작업을 원하지만 약간의 작업이며 다른 사람들이 그렇게 기대 하지 않습니다 . 내가 배우면서 시간이 지남에 따라 그것을 할 것이고 이것은 나를위한 참고 자료가 될 것입니다.
Adam Davis

9

콘솔 UI-Tig

설치:

apt-get install tig

용법

git repo 안에 'tig'를 입력하면 대화 형 로그를 볼 수 있으며 로그에 대한 'enter'를 누르면 자세한 정보를 볼 수 있습니다. h 는 기본 기능을 나열합니다.

하찮은 일

"Tig"는 "Git"입니다.


"콘솔"과 "그래픽"은 약간 모순되기 때문에 "콘솔 UI"가되어서는 안됩니다.
dbr

그것은 git-log보다 훨씬 더 그래픽 적이지만 ... 훨씬 더 인터페이스 가능합니다 ...
Dean Rather

8

원격 저장소에서 분기를 작성하려면 어떻게해야합니까?

일부 단일 원격 저장소에서 원격 저장소를 복제했다고 가정하십시오.

# create a new branch locally
git branch name_of_branch
git checkout name_of_branch
# edit/add/remove files    
# ... 
# Commit your changes locally
git add fileName
git commit -m Message
# push changes and new branch to remote repository:
git push origin name_of_branch:name_of_branch

11
왜 name_of_branch : name_of_branch입니까?
Seun Osewa

예, 왜요? 내가 아는 한, 필요한 것만 git push origin name_of_branch있고 지점은 이미 리모컨에 생성 될 것입니다.
Felipe Sabino

첫 번째 name_of_branch는 로컬 이름이고 두 번째는 (원하는) 원격 지점 이름이므로 local_name_of_branch:remote_name_of_branch이름을 다르게 할 수 있습니다 . 그것들을 동일하게 원한다면,이 b / c git은 이름을 말하지 않는 한 이름을 동일하다고 가정하지 않습니다 (다른 방법도 있습니다)
johnny

8

공식 Git 튜토리얼을 시작했다 . 나는 초보자에게 충분히 실용적이라고 생각합니다 (나는 당신의 정의에 따라 초보자였으며 여전히 초보자입니다!


8

원격 저장소에서 분기를 어떻게 삭제합니까?

:지점 이름을 사용하여 리모컨에서 푸시를 수행하십시오.

git push origin :mybranchname

되는 origin원격의 이름과mybranchname 삭제 될 대해 분기의 이름

http://help.github.com/remotes/


7

밀고 당기기 변경

단순화 된 방식으로 git pushand을 수행하십시오 git pull. 변경 사항이 병합되고 충돌이 발생하면 자식이 알려주고 수동으로 해결할 수 있습니다.

원격 저장소로 처음 푸시 할 때 git push origin master(마스터가 마스터 브랜치)해야합니다. 그때부터 당신은 그냥 git push.

로 태그를 푸시하십시오 git push --tags.


7

코드 확인

먼저 빈 디렉토리로 가서 "git init"를 사용하여 저장소로 만든 다음 원격 저장소를 자신의 것으로 복제하십시오.

git clone user@host.com:/dir/to/repo

처음에 복제하는 곳은 기본적으로 "git pull"을 가져 오는 위치입니다.


7
클론은 init 단계를 먼저 수행해야한다고 생각합니다. git init은 실제로 첫 번째 저장소를 만들거나 표준 클론과 다르게 설정하려는 여러 리모컨이있는 특수 구성을위한 것입니다.
Jeremy Wall

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.