一、基本操作
-
將當前目錄初始化一個git倉庫
git init
-
將文件快照放入暫存區域
git add 文件
-
提交更新,找到暫存區域的文件,將快照永久存儲到git倉庫
git commit -m "提交信息,建議寫有意義的詳細信息,方便從歷史記錄中找到改動記錄"
可以多次git add 不同文件,commit一次將暫存區所有修改提交 -
查看倉庫當前狀態
git status
下面的命令輸出告訴我們,demo.txt被修改過,但未提交
$ git status
On branch master
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: demo.txt
no changes added to commit (use "git add" and/or "git commit -a")
-
查看修改的內容
git diff 文件
-
查看提交日志
git log
如果看的眼花繚亂,可以加上--pretty=oneline
-
回退到某一版本
git reset --hard 某一版本
回退到往上100個版本
HEAD
表示當前版本
HEAD^
表示上一個版本
HEAD^^
表示上上一個版本
HEAD~100
表示往上100個版本 -
回到之前最新版本
git reset --hard 版本id
id越長越好,不然容易找到多個版本號- 在命令行窗口還沒關閉的情況下,找到那一版本的commit id(一串十六進制)
- Git提供了一個命令記錄你的每一次命令
git reflog
可以從中找到對應commit id
-
撤銷修改
git checkout -- 文件
回退到最近一次git commit
或git add
時的狀態
命令中--
很重要,沒有就變成“切換到另一個分支” -
撤銷暫存區的文件,重新放回工作區
git reset HEAD 文件
-
刪除文件
git rm 文件
- 第一種情況
git rm
并且git commit
將刪除版本庫的文件。 - 第二種情況
git checkout -- 文件
將被刪除的文件恢復到最新版本。
- 第一種情況
二、遠程倉庫
-
創建SSH Key
ssh-keygen -t rsa -C "郵箱"
會在用戶主目錄下生成.ssh目錄
id_rsa
私鑰,不可泄露
id_rsa.pub
公鑰,可以告訴任何人 - 在GitLab上添加SSH密鑰(公鑰)
- 在GitLab中創建倉庫,并復制倉庫的SSH格式的URL(注意不是地址欄的URL)
添加遠程倉庫
-
關聯遠程庫,在本地倉庫下運行命令
git remote add origin 倉庫URL
這里是GitLab倉庫的URL
其中origin
是遠程庫的名字,可以修改。 -
將本地庫內容推送到遠程庫
git push -u 遠程庫名稱 master
??用git push命令,實際上是把當前分支master推送到遠程。
??由于遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。
??從現在起,只要本地作了提交,就可以通過命令git push 遠程庫名稱 master
推送到GitLab
從遠程庫克隆
git clone 遠程倉庫的URL
//這樣本地倉庫就已經將遠程倉庫項目克隆下來了。
三、分支管理
??因為創建、合并和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。
-
創建并切換分支
git checkout -b 分支
git checkout
命令加上-b
表示創建并切換,相當于一下兩條命令
git branch 分支
git checkout 分支
查看當前分支
git branch
切換分支
git checkout 分支
合并指定分支到當前分支
git merge 指定分支
刪除分支
git branch -d 分支
-
解決沖突
修改dev分支后
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
//修改分支后,從分支切換到master時,Git還會自動提示我們當前master分支比遠程的master分支要超前1個提交。
如果此時再修改master分支內容,合并時會提示沖突
$ git merge feature1
Auto-merging demo.txt
CONFLICT (content): Merge conflict in demo.txt
Automatic merge failed; fix conflicts and then commit the result.
//Git告訴我們,demo.txt文件存在沖突,必須手動解決沖突后再提交。
git status也可以告訴我們沖突的文件
在文件內容中Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
將沖突的內容統一,解決沖突內容后重新提交即可。
- 查看分支合并情況
git log --graph --pretty=oneline --abbrev-commit
git log --graph
查看分支合并圖
分支管理策略
??通常,合并分支時,如果可能,Git會用Fast forward
模式,但這種模式下,刪除分支后,會丟掉分支信息。
如果要強制禁用Fast forward
模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
- 禁用
Fast forward
模式,創建分支
git merge --no-ff -m "詳細合并信息" dev
BUG分支
??軟件開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由于分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復后,合并分支,然后將臨時分支刪除。
??當你接到一個修復一個代號101的bug的任務時,很自然地,你想創建一個分支issue-101來修復它,但是,當前正在dev上進行的工作還沒有提交。
??并不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎么辦?
??幸好,Git還提供了一個stash
功能,可以把當前工作現場“儲藏”起來,等修改BUG以后恢復現場繼續工作:
-
將當前工作現場“儲藏”起來,等以后恢復現場繼續工作
git stash
現在用git status
查看工作區,工作區就是干凈的(除非沒有被Git管理的文件) -
查看“儲藏”的工作現場
git stash list
-
恢復最近一次“儲藏”的工作現場
git stash apply
恢復指定工作現場,通過git stash list
查看工作現場的序號,將(stash@{序號})追加到命令后面
注意,序號越靠后,說明儲藏的時間越長
這樣恢復后,stash內容并不會刪除,需要手動刪除 -
刪除“儲藏”的工作現場
git stash drop
-
恢復并刪除“儲藏”的工作現場
git stash pop
-
master分支出現bug,說明dev同樣也存在,Git專門提供了命令,讓我們復制一個特定的提交到當前分支
git cherry-pick 特定的提交id
Feature分支
??軟件開發中,總有無窮無盡的新的功能要不斷添加進來。
??添加一個新功能時,你肯定不希望因為一些實驗性質的代碼,把主分支搞亂了,所以,每添加一個新功能,最好新建一個feature分支,在上面開發,完成后,合并,最后,刪除該feature分支。
??如果在feature分支還沒有合并前,需要取消這個功能,刪除時會銷毀失敗,需要使用大寫的-D
參數強制刪除。
?? git branch -D 分支
多人協作
??當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默認名稱是origin。
-
查看遠程庫的信息
git remote -v
-v
表示詳細信息 -
推送分支
git push 遠程庫名稱 本地分支名稱
-
抓取分支
git clone 遠程倉庫的URL
默認只能看到本地的master分支
如果要在dev分支上開發,就必須創建遠程origin的dev分支到本地
git checkout -b dev origin/dev
創建并且還dev分支,并將遠程庫origin/dev 弄下來
如果最新提交和你推送的提交有沖突,先用git pull
把最新提交抓下來,然后在本地合并,解決沖突,再提交。
//git pull 失敗
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
//原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據提示,設置dev和origin/dev的鏈接
設置本地分支dev與遠程分支origin/dev的鏈接
git branch --set-upstream-to=origin/dev dev
多人協作工作模式
盡量將沖突在本地解決
- pull遠程庫內容到本地先進行合并
- 如合并沖突,則解決沖突
- 如沒有沖突或解決后,再commit 并push到遠程庫
四、遇到的問題
- HTTP Basic: Access denied 錯誤
- 如果賬號密碼變動,使用
git config --system --unset credential.helper
重新輸入賬號密碼 - 如果第一條命令解決失敗,使用
git config --global http.emptyAuth true
- 還可以進入 控制面板>>用戶賬號>>憑據管理器>>windows憑據>>普通憑據 ,在里面找到git,可以編輯用戶密碼