git

git

一、git客戶端(本地倉庫)的一些操作
1.設置賬戶(需要和github賬戶設置一致)
git config --global user.name xxx
git config --global user.email [email protected]

2.查看設置
git config --list
user.name=xxx
[email protected]

3.創建git本地倉庫
git init
此時會出現提示 : inialized empty Git repository in d://com/liu/.git

4.查看git狀態
git status
一般來說會顯示需要提交的文件(uncommited)和未追蹤的文件(untracked)
uncommited:已有的,剛被修改尚未提交的
untracked:原先沒有的,新建的

5.添加git文件到暫存區(需要和版本庫區分)
git add <name>

6.git提交文件
git commit -m "add a function in test.java"
-m表示註釋,爲提交時的說明,必須要有!

7.git刪除文件(夾)
git rm test.txt //刪除文件
git rm -r filebook //刪除文件夾
git rm和直接刪除的區別在於git rm會將此文件的操作記錄刪除,而直接刪除僅僅是刪除了物理文件,沒有刪除和此文件相關的記錄。git rm後會在版本庫產生區別(有操作日誌),而直接刪除沒有。
可以用下面兩種操作在版本庫中刪除文件:
git rm test.txt => git commit -m 'delete a file'
rm test.txt => git commit -am 'delete a file'
注意:命令git rm用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。

8.git操作日誌
git log --decorate --graph --oneline --all #顯示當前及之前的版本號
git log --pretty=oneline #將版本歷史顯示爲一行,歷史版本號全部顯示
git log --pretty=oneline --abbrev-commit #將版本歷史顯示爲一行,歷史版本號部分顯示
git log --graph #查看分支合併圖

9.版本回退
執行版本退回後,本地工作區的內容會自動和回退到的版本庫版本的內容保持同步
git reset --hard HEAD^ 回退到上一個版本
git reset --hard HEAD^^ 回退到上上個版本,以此類推,一次提交即爲一個版本
git reset --hard e9efa77 回退到 e9efa77 版本

10.git還原操作
丟棄工作區的操作,但不會丟失暫存區的操作(add操作能將更改添加到暫存區),實際上就是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”
git checkout -- readme.txt

11.git暫存區撤銷操作
工作區修改了文件,而且執行了add,但還沒執行commit,暫存區還是可以撤銷的
git reset HEAD readme.txt
備註:git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。

二.與github/gitee協同使用(git代碼託管服務器)
和GitHub相比,碼雲(Gitee)也提供免費的Git倉庫。此外,還集成了代碼質量檢測、項目演示等功能。對於團隊協作開發,碼雲還提供了項目管理、代碼託管、文檔管理的服務,5人以下小團隊免費。

1.配置遠程倉庫免密登陸
(1)在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:ssh-keygen -t rsa -C "[email protected]"
備註:一路回車,執行生成 id_rsa 私鑰 和 id_rsa.pub 公鑰,Windows用戶在git bash中輸入上述指令
(2)獲得key的內容,複製下來,添加到gitHub的SSH key中
windows位置:‪C:\Users\用戶名\.ssh\id_rsa.pub
Linux位置:cat ~/.ssh/id_rsa.pub

 

(3)ssh -T [email protected] #驗證key,根據提示輸入yes,添加爲信任主機
或者ssh -T [email protected]

2.添加遠程倉庫
git remote add origin https://github.com/xxx/LearnGit.git(https方式)
(ssh方式)
此處可以爲https地址也可以是ssh地址,orign爲設置的遠程倉庫的別名,強烈建議使用ssh方式,因爲https方式每次都要輸入用戶名和密碼
如果需要修改傳輸協議:
(1)git remote rm <遠程主機名>(刪除遠程倉庫)
(2)設置傳輸方式和目標遠程倉庫
(3)git push -u <遠程主機名> <本地分支名>

碼雲的添加遠程倉庫方法:
git remote add origin [email protected]:xxx/LearnGit.git(ssh方式)
如果git remote add失敗,並報錯:fatal: remote origin already exists.
說明本地庫已經關聯了一個名叫origin的遠程庫,此時,可以先用git remote -v查看遠程庫信息:
origin [email protected]:xxx/LearnGit.git (fetch)
origin [email protected]:xxx/LearnGit.git (push)
表示本地庫已經關聯了Github上的origin遠程庫,需要先刪除已有的Github庫:
git remote remove origin
再關聯碼雲的遠程庫(注意路徑中需要填寫正確的用戶名):
git remote add gitee [email protected]:xxx/LearnGit.git

因爲git本身是分佈式版本控制系統,可以同步到另外一個遠程庫,當然也可以同步到另外兩個遠程庫,所以一個本地庫可以既關聯GitHub,又關聯碼雲!
使用多個遠程庫時,要注意git給遠程庫起的默認名稱是origin,如果有多個遠程庫,我們需要用不同的名稱來標識不同的遠程庫。仍然以learngit本地庫爲例,先刪除已關聯的名爲origin的遠程庫:
git remote rm origin
然後,先關聯GitHub的遠程庫:
git remote add github [email protected]:xxx/LearnGit.git
注意,遠程庫的名稱叫github,不叫origin了。
接着,再關聯碼雲的遠程庫:
git remote add gitee [email protected]:xxx/LearnGit.git
同樣注意,遠程庫的名稱叫gitee,不叫origin。
現在,我們用git remote -v查看遠程庫信息,可以看到兩個遠程庫:gitee [email protected]:xxx/LearnGit.git (fetch)
gitee [email protected]:xxx/LearnGit.git (push)
github [email protected]:xxx/LearnGit.git (fetch)
github [email protected]:xxx/LearnGit.git (push)
如果要推送到GitHub,使用命令:
git push github master
如果要推送到碼雲,使用命令:
git push gitee master
這樣一來,本地庫就可以同時與多個遠程庫互相同步:

3.查看遠程倉庫及傳輸協議
git remote
git remote -v 查看名稱和詳細地址

4.刪除遠程倉庫
git remote remove <遠程主機名>

5.推送本地分支到遠程倉庫
git push <遠程主機名> <本地分支名>:<遠程分支名>
如果省略遠程分支名,則表示將本地分支推送與之存在“追蹤關係”的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建。
git push origin <本地分支名>
git push origin master
如果當前分支與多個主機存在追蹤關係,則可以使用-u選項指定一個默認主機,這樣以後就可以不加任何參數使用git push。
git push -u <遠程主機名> <本地分支名> 例如:git push -u origin master

6.將遠程倉庫克隆爲本地倉庫
git clone [email protected]:xxx/LearnGit.git
注意:
(1)不能使用別名
(2)默認情況下,從遠程clone到本地的庫只能看到master分支,如果要將遠程的分支同步到本地:
git checkout -b <本地分支名> <遠程主機名>/<遠程分支名>
前提是遠程<遠程主機名>必須存在名爲<遠程分支名>的分支,而且<本地分支名>和<遠程分支名>最好一致。

7.本地倉庫更新
將遠程存儲庫中的更改合併到當前分支中。在默認模式下,git pull是git fetch後跟git merge FETCH_HEAD的縮寫。更準確地說,git pull使用給定的參數運行git fetch,並調用git merge將檢索到的分支頭合併到當前分支中。 使用--rebase,它運行git rebase而不是git merge。
以下是一些示例:
git pull <遠程主機名> <遠程分支名>:<本地分支名>
比如,要取回origin主機的next分支,與本地的master分支合併,需要寫成下面這樣 -
git pull origin next:master
如果遠程分支(next)要與當前分支合併,則冒號後面的部分可以省略。上面命令可以簡寫爲:
git pull origin next
上面命令表示,取回origin/next分支,再與當前分支合併。實質上,這等同於先做git fetch,再執行git merge。
git fetch origin => git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,建立一種追蹤關係(tracking)。比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關係,也就是說,本地的master分支自動“追蹤”origin/master分支。Git也允許手動建立追蹤關係:
git branch --set-upstream-to=遠程主機名/<遠程分支名>  <本地分支名>
比如git branch --set-upstream-to=origin/next master,指定master分支追蹤origin/next分支。
git pull origin
上面命令表示,本地當前分支自動與對應的origin主機”追蹤分支”(remote-tracking branch)進行合併。
如果當前分支只有一個追蹤分支,連遠程主機名都可以省略。
git pull
上面命令表示,當前分支自動與唯一一個追蹤分支進行合併。
如果合併需要採用rebase模式,可以使用–rebase選項。
git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>

git fetch和git pull的區別
(1)git fetch:相當於是從遠程獲取最新版本到本地,不會自動合併。
git fetch origin mastergit log -p master..origin/mastergit merge origin/master
以上命令的含義:
首先從遠程的origin的master主分支下載最新的版本到origin/master分支上
然後比較本地的master分支和origin/master分支的差別
最後進行合併
上述過程其實可以用以下更清晰的方式來進行:
git fetch origin master:tmpgit diff tmp git merge tmp
(2)git pull:相當於是從遠程獲取最新版本並merge到本地
git pull origin master
上述命令其實相當於git fetch 和 git merge
在實際使用中,git fetch更安全一些,因爲在merge前,可以查看更新情況,然後再決定是否合併。

8.查看分支
git branch

9.創建分支
git branch <name>

10.創建並切換到分支
git checkout -b <name>
備註:git checkout命令加上-b參數表示創建並切換,相當於以下兩條命令
git branch <name>git checkout <name>

11.切換分支
git checkout <name>
切換分支後,在git bash中顯示爲綠色

12.刪除分支
git branch -d <name>
如果分支沒有合併,刪除分支就表示會丟失修改,此時git無法使用-d刪除,可使用-D強行刪除
git branch -D <name>

13.合併分支
git合併默認使用Fast forward模式,一旦刪除分支,會丟掉分支信息,也就看不出來曾經做過合併
git merge <name> #基於當前分支,合併另外一個分支,前提需要保證分支之間不衝突
如果強制禁用Fast forward模式,即普通模式,Git就會在merge時生成一個新的commit
git merge --no-ff -m "there is a comment" <name>
因爲本次合併要創建一個新的commit,所以加上-m參數,把commit描述寫進去。
工作中,肯定需要不管有沒有分支被刪除,都要從分支歷史上就查看所有的歷史分支信息,所以要使用普通模式合併。

14.創建tag
(1)git tag <tagname> #默認在HEAD版本
(2)對指定的commit版本創建tag
需要先找到歷史commit的id
git log --pretty=oneline --abbrev-commit
然後對指定的commit創建tag:
git tag <tagname> <commitid>
(3)創建帶有說明的tag,用-a指定標籤名,-m指定說明文字
git tag -a <tagname> -m "there is a tag description" [<commitid>]
(4)通過-s用私鑰簽名一個標籤,簽名採用PGP簽名
git tag -s <tagname> -m "there is a tag description" [<commitid>]
必須首先安裝gpg(GnuPG),如果沒有找到gpg,或者沒有gpg密鑰對,就會報錯,參考GnuPG幫助文檔配置Key。

15.查看tag
git tag #顯示的tag不是按時間順序排列,而是按字母順序排列
如果想查看tag和commit的對應關係,可以用
git log --pretty=oneline --abbrev-commit
如果想查看tag的的詳細情況,可以用
git show <tagname>

16.刪除tag
創建的標籤都只存儲在本地,不會自動推送到遠程。所以,打錯的標籤可以在本地安全刪除:
git tag -d <tagname>
如果標籤已經推送到遠程,要刪除遠程標籤就麻煩一點:
(1)先本地刪除:git tag -d <tagname>
(2)再遠程刪除:git push origin :refs/tags/<tagname>

17.推送標籤至遠程
git push origin <tagname>
或者,一次性推送全部尚未推送到遠程的本地標籤:
git push origin --tags

18.現場的保存與恢復
git stash #將目前的工作現場保存
git stash list #查看所有保存的工作現場
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一是用git stash apply stash@{0}恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop stash@{0}來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了,這種方式省時省力
注意點:
(1)如果在分支下新建文件,而尚未執行add操作,stash無法將新文件納入保存的現場,因爲stash只對被修改的被追蹤的文件和暫存的變更有效,對於新文件必須先執行add。
(2)如果修改分支下的已被追蹤的文件,不管有沒有對修改的文件進行add操作,如果執行stash,所有修改會被納入保存的現場,而文件會恢復成修改前的狀態。恢復現場後,文件又呈現被修改後的狀態。特別的是,如果修改的文件在stash前已經被add了,恢復現場後,暫存區的內容就會清空,相當於這個文件從未被add一樣。

19.設置Git UI顏色
讓Git顯示顏色,會讓命令輸出看起來更醒目
git config --global color.ui true

20.忽略特殊文件
(1)在Git工作區的根目錄下創建一個特殊的.gitignore文件,然後把要忽略的文件名填進去,Git就會自動忽略這些文件。不需要從頭寫.gitignore文件,GitHub已經爲我們準備了各種配置文件,只需要組合一下就可以使用了。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore
忽略文件的原則是:
忽略操作系統自動生成的文件,比如縮略圖等;
忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件;
忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
比如一個完成的.gitignore文件,內容如下:
------------------------------
# Windows:Thumbs.dbehthumbs.dbDesktop.ini

# Python:*.py[cod]*.so*.egg*.egg-infodistbuild
-------------------------------
(2)把.gitignore也提交到Git
git add .gitignore
git commit -m "there is a description"
就完成了!當然檢驗.gitignore的標準是git status命令是不是顯示working tree clean。
使用Windows的注意:如果在資源管理器裏新建一個.gitignore文件,系統會非常弱智地提示必須輸入文件名,但是在文本編輯器裏“保存”或者“另存爲”就可以把文件保存爲.gitignore了。

(3)如果確實想要添加已經被.gitignore忽略的文件,可以用-f強制添加到Git
git add -f test.class

(4)懷疑.gitignore寫的有問題,需要查找哪個規則寫錯了,可以用git check-ignore命令檢查:
git check-ignore -v App.class.gitignore:3:*.class App.class
表示.gitignore的第3行規則忽略了App.class這個文件,於是我們就可以知道應該修訂哪個規則。

21.爲命令配置別名
(1)命令可以簡寫,用git st表示git status,再比如用co表示checkout、ci表示commit、br表示branch:
git config --global alias.co checkoutgit config --global alias.ci commitgit config --global alias.br branch
以後提交就可以簡寫成:
git ci -m "there is a description"
--global參數是全局參數,也就是這些命令在這臺電腦的所有Git倉庫下都有用。

(2)命令git reset HEAD <filename>可以撤銷暫存區的修改(unstage),重新放回工作區。既然是一個unstage操作,就可以配置一個unstage別名:
git config --global alias.unstage 'reset HEAD'
就可以簡化命令:
git unstage test.py = git reset HEAD test.py

(3)配置一個git last,讓其顯示最後一次提交信息:
git config --global alias.last 'log -1'
這樣,用git last就能顯示最近一次的提交:
git lastcommit 015851cbe2902bf01fbba198af5d6705dc0e03ac (HEAD -> dev)
Author: xxx <[email protected]>
Date: Mon Apr 23 13:52:44 2018 +0800
add git ignore list
(4)還有把lg配置成了:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
來看看git lg的效果:

22.修改配置文件
配置Git的時候,加上--global是針對當前用戶起作用的,如果不加,那隻針對當前的倉庫起作用。
每個倉庫的Git配置文件都放在.git/config文件中:
cat .git/config
-----------------------------------------------------------------------------
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[branch "master"]
[branch "dev"]
[remote "github"]
url = [email protected]:xxx/LearnGit.git
fetch = +refs/heads/*:refs/remotes/github/*
[remote "gitee"]
url = [email protected]:xxx/LearnGit.git
fetch = +refs/heads/*:refs/remotes/gitee/*
-----------------------------------------------------------------------------

而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中:
-----------------------------------------------------------------------------
[user]
name = xxx
email = [email protected]
[gpg]
program = C:\\Program Files (x86)\\gnupg\\bin\\gpg.exe
[color]
ui = true
[alias]
co = checkout
ci = commit
br = branch
last = log -1
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
-----------------------------------------------------------------------------
別名就在[alias]後面,要刪除別名,直接把對應的行刪掉即可。配置別名也可以直接修改這個文件,如果改錯了,可以刪掉文件重新通過命令配置。


多人協作的工作模式通常如下:
(1)首先將遠程倉庫克隆爲本地倉庫
git clone [email protected]:xxx/LearnGit.git
(2)在本地創建和遠程分支對應的分支
git checkout -b <本地分支名> origin/<遠程分支名>
本地和遠程分支的名稱最好一致;
(3)在本地分支完成任務後,可以試圖用git push <遠程主機名> <本地分支名>推送自己的修改;
(2)如果推送失敗,則表明遠程分支比本地更新,需要先用git pull試圖合併;
(3)如果pull失敗並提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream-to=<遠程主機名>/<遠程分支名>  <本地分支名>創建鏈接;
(4)如果合併有衝突,則解決衝突,並在本地提交(add => commit);
(5)沒有衝突或者解決掉衝突後,再用git push <遠程主機名> <本地分支名>推送就能成功。

posted @ 2019-06-09 23:04 ChuckXue 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章