1. 程式人生 > >Git 使用總結

Git 使用總結

stat 本地 公鑰 shel 切換 mint 無法登錄 貢獻 執行

Windows用戶git官網下載安裝包:https://git-scm.com/
雙擊一路Next安裝完畢
打開Git Bash,設置如下,

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

註意:--global 是全局參數,也就是在當前這臺電腦上的所有 Git 倉庫下都有用。

//========================================================================================

git init : 在工程目錄下運行,創建一個Git倉庫

git add <file> [file [file] ...] : 添加新file或修改file到Git倉庫,可多次使用
git commit -m "here add message" : 提交更改到Git倉庫,註意每次提交默認必須添加信息

git status : 查看當前Git倉庫狀態

git log : 打印Git倉庫的詳細log信息,由最近到最遠的修改


git log --pretty=oneline : 打印Git倉庫的簡化log信息,由最近到最遠的修改
git log --graph --pretty=oneline : 以圖示的方式,打印Git倉庫的簡化信息,由最近到最遠的修改
git log --pretty=oneline --abbrev-commit : 以較短的版本號顯示log信息,一般是前7位

git reset --hard HEAD^ : 回退到前一個版本,回退到前兩個版本HEAD^^,前三個HEAD^^^,前100個HEAD~100
git reset --hard xxxxxx : 回退到某一個版本號指定的版本,只用指定版本的前幾位即可(一般6位吧,有沖突再加長)

git reflog : 顯示之前的各次命令,可以尋找版本號哦……比如要從當前的舊版本再回到某個較新的版本,
這時需要知道相關版本號信息

//////////////////////////////////////////////////////////////////////////////////////////
1st common usage: 修改1 -> git add -> git commit -> 修改2 -> git add -> git commit -> ...
2nd common usage: 修改1 -> git add -> 修改2 -> git add -> ... -> git add -> git commit
//////////////////////////////////////////////////////////////////////////////////////////

git diff : 比較當前本地和Git倉庫,可用於簡單修改後的倉庫對比
git diff HEAD -- <filename> : 比較當前某一文件和Git倉庫的這個文件

git checkout -- <filename> : 放棄對本地某一文件的修改(已修改,還未add到暫存區),重新從Git倉庫checkout此文件

git reset HEAD <filename> : 放棄對本地某一文件的修改(已修改,且已add到暫存區),先撤銷暫存區的add
git checkout -- <filename> : 再重新從Git倉庫checkout此文件

git reset --hard HEAD^ : 錯誤的修改了本地某一文件,已add到暫存區了,且已commit到Git倉庫了(還未推送到遠程庫),
要放棄對此文件的修改,只能版本回退。如當前這個命令退到前一版本

git rm <filename> : 從Git倉庫刪除某一文件
git commit -m "here add message" : 需要提交更改

//============================================================================================

創建SSH Key,如下命令一路回車,將生成 .ssh 文件夾,裏面有私鑰id_rsa,公鑰id_rsa.pub,

$ ssh-keygen -t rsa -C "[email protected]"

登錄Github,我的賬戶是: badboycoming,密碼是: ABC12345q
點擊Account Setting,點擊 SSH Keys 頁面,填入 id_ras.pub 的內容。

關聯一個遠程庫:git remote add origin [email protected]:path/repo-name.git,例如,

////////////////////////////////////////////////////////////////////////////////////////////

我要將本地的Git倉庫mylearning推送到Github的名為mylearning.git的Repository,

在本地的Git倉庫下,運行命令
$ git remote add origin [email protected]:badboycoming/mylearning.git

首次將本地master分支推送到Github,
$ git push -u origin master

之後就可以推送最新的修改到Github了,
$ git push origin master # 推送 master 分支
$ git push origin dev # 推送 dev 分支

////////////////////////////////////////////////////////////////////////////////////////////

我要將Github上的遠程庫克隆到本地,

使用SSH方式(速度最快),
$ git clone [email protected]:badboycoming/helloworld.git

使用HTTP方式(適用於某公司禁止SSH端口,只開放HTTP端口)
$ git clone https://github.com/badboycoming/helloworld.git

////////////////////////////////////////////////////////////////////////////////////////////

Git鼓勵大量使用分支,因為Git創建,合並,刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,
合並後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

查看分支 : git branch
創建分支 : git branch <name>
切換分支 : git checkout <name>
創建+切換分支 : git checkout -b <name>
合並某分支到當前分支 : git merge <name>
刪除分支 : git branch -d <name>

////////////////////////////////////////////////////////////////////////////////////////////

Git 解決沖突

合並分支出現沖突,手動修改後,add,commit。
查看分支縮略圖 : git log --graph --pretty=oneline --abbrev-commit

////////////////////////////////////////////////////////////////////////////////////////////

Git 分支管理策略:

通常,合並分支時,如果可能,Git會用到 Fast Forward 模式,但這種模式下,刪除分支後,會丟失分支信息。
如果禁止 Fast Forward 模式,Git 就會在 merge 時生成一個新的 commit,這樣,從分支歷史上就可以看出分支信息。

假設要合並的分支為dev,禁用 Fast Forward 模式的 merge 命令為,
$ git merge --no-ff -m "here add message" dev

實際開發中的分支管理策略:

首先,master 分支應該是非常穩定的,也就是用來發布新頒布的,平時不能在上面幹活。
然後,建立一個 dev 分支,團隊成員都在 dev 分支上幹活,當某個時候,比如發布1.0版本的時候,
把 dev 分支再 merge 到 master 分支上去。
最後,Git 分支十分強大,在團隊開發中應該充分應用。

///////////////////////////////////////////////////////////////////////////////////////////

Git 臨時保存工作區

修復 bug 時,一般會通過創建新的 bug 分支進行修復,然後合並,最後刪除。
當手頭的 dev 分支的工作沒有完成時,先把工作現場用命令 git stash 保存一下,然後切換回 master 分支,
創建一個新分支例如 bug-101 去修復 bug,然後將更改 merge 到 master 分支,
再回到 dev 分支,用 git stash pop 恢復之前的工作現場。

高級用法如下:

另一種恢復方法是,用 git stash apply ,但是這種方法不會刪除保存的現場,要用 git stash drop 來刪除。
可以用 git stash lis 來查看保存的所有現場,用 git stash apply [email protected]{x} 來恢復想要的現場。

///////////////////////////////////////////////////////////////////////////////////////////

Git 丟棄一個未合並的分支

一般開發一個新的 feature,最好新建一個分支,
如果要丟棄一個沒有被合並的分支,可以通過命令 git branch -D <name> 強行刪除。

///////////////////////////////////////////////////////////////////////////////////////////

Git 多人協作

查看遠程庫的信息,用命令 git remote # 一般習慣遠程Git倉庫默認名稱使用 origin,也可隨意指定
查看遠程庫的詳細信息,用命令 git remote -v

推送本地 master 分支到遠程 master 分支,用命令 git push origin master
推送本地 dev 分支到遠程 dev 分支,用命令 git push origin dev

哪些分支需要推送,哪些不需要推送 ?

- master 分支是主分支,因此要時刻與遠程同步
- dev 分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步
- bug 分支只用於本地修復 bug,沒不要推到遠程了,除非老板要看看你每周修復了幾個 bug
- feature 分支是否推送到遠程,取決於你是否和團隊成員合作在上面開發

///////////////////////////////////////////////////////////////////////////////////////////

現在模擬項目新進一個開發者,

- 首先,他要從遠程 Git 倉庫 clone,用命令 git clone [email protected]:badboycoming/mylearning.git
clone 完成後,默認情況下,他只能看到本地的 master 分支

- 因為他需要在本地 dev 分支上開發,所以,他要在本地創建 dev 分支,並把本地 dev 分支和 origin/dev 關聯,
用命令 git checkout -b dev origin/dev

- 然後他就可以在本地 dev 分支上工作,即 git add xxx, git commint -m “xxx”, …… , 然後時不時的將他的開發
push 到遠程 origin/dev,用命令 git push origin dev

如果他對某個文件做了修改,並且已經 push 到遠程 origin/dev 分支,而你在本地也修改了同一文件,
你要將修改 push 到遠程 origin/dev 時,會提示發生沖突,這時你需要首先從遠程 origin/dev 分支拉去他的更改,
再你的本地解決沖突,之後再 push 到遠程。

拉遠程的分支,如當前分支為 dev, 要拉遠程的 origin/dev, 用命令 git pull
註,有時拉遠程分支失敗,提示信息你的本地分支沒有和遠程的分支關聯,需要先關聯,
用命令 git branch --set-upstream dev origin/dev,然後再 git pull

--------------------------------------------------------------------------------------------------
總結: 多人協作模式通常是這樣,

1) 首先,試圖用 git push origin <branch-name> 推送自己的修改
2) 如果推送失敗,則因為遠程分支比你的本地分支新,需要先用 git pull 拉遠程修改,並自動在本地合並
3) 如果合並有沖突,git pull 會提示,這時需要手動解決沖突,並在本地提交
4) 沒有沖突,或解決掉沖突後,再用 git push origin <branch-name> 推送

註:如果 git pull 提示 "no tracking information",則說明本地分支和遠程分支的鏈接關系沒有創建,
用命令 git branch --set-upstream <branch-name> origin/<branch-name> 來鏈接即可。
--------------------------------------------------------------------------------------------------

///////////////////////////////////////////////////////////////////////////////////////////

Git 標簽管理

git tag <tagname> : 新建一個標簽,默認對 HEAD 當前版本建立,也可以指定一個 commit id,
用命令 git log --pretty=oneline --abbrev-commit 查看 commit id

git tag -a <tagname> -m "blablabla..." : 添加標簽時,指定標簽信息

git tag : 查看所有標簽
git show <tagname> : 查看某一標簽的詳細信息

git tag -d <tagname> : 刪除某一本地標簽

git push origin <tagname> : 推送某個標簽到遠程

git push origin --tags : 一次性推送全部尚未推送到遠程的本地標簽

要刪除已推送到遠程的標簽,需要兩步:
git tag -d <tagname> : 先刪除本地標簽
git push origin :refs/tags/<tagname> : 再刪除遠程標簽

///////////////////////////////////////////////////////////////////////////////////////////

Git 和 Github 開源倉庫

一般情況下,Github 可以作為個人的免費倉庫。如果要參與其它開源項目,如下操作:

1) Fork 開源倉庫
2)自己擁有 Fork 後倉庫的讀寫權限
3) 推送 pull request 給官方倉庫貢獻代碼

///////////////////////////////////////////////////////////////////////////////////////////

使用國內的 Git 托管服務 碼雲(https://gitee.com/)

1) 註冊,添加 SSH 公鑰
2) 新建遠程項目 mylearning
3) 在本地 mylearning 下,add 遠程 mylearning 倉庫,命令如下,
$ git remote add origin-gitee [email protected]:badboycoming/mylearning.git

註意,此處取名為 origin-gitee,因為已經有了一個名為 origin 的遠程庫,指向 github

例如,現在我的本地 mylearning 庫底下已將有兩個遠程庫了,如下,

[email protected] MINGW64 /e/mylearning (master)
$ git remote
origin
origin-gitee

詳細信息如下,可見它們分別指向 github 和 gitee

[email protected] MINGW64 /e/mylearning (master)
$ git remote -v
origin [email protected]:badboycoming/mylearning.git (fetch)
origin [email protected]:badboycoming/mylearning.git (push)
origin-gitee [email protected]:badboycoming/mylearning.git (fetch)
origin-gitee [email protected]:badboycoming/mylearning.git (push)

另外,如果要刪除本地的某個遠程庫關聯,可用命令如下,

$ git remote rm origin # 刪除本地到 github 遠程庫的關聯 origin
$ git remote rm origin-gitee # 刪除本地到 gitee 遠程庫的關聯 origin-gitee

4) 要將本地項目推送到遠程

$ git push origin-gitee master # 推送到 gitee
$ git push origin master # 推送到 github

///////////////////////////////////////////////////////////////////////////////////////////

Git 配置顏色: git config --global color.ui true

///////////////////////////////////////////////////////////////////////////////////////////

忽略特殊文件

有時候,必須把某些文件放在 Git 工作目錄(比如你的參考文檔,心得筆記,或自動生成的文件如 .pyc 文件),
但又不想 git status 報 Untracked files ... 的煩人消息,則可以如下處理。

- 在 Git 工作目錄下創建文件 .gitignore,然後把要忽略的文件名填進去,Git就會自動忽略這些文件。
- 將 .gitignore 提交到 Git 倉庫。

註:常用的 .gitignore 可在 https://github.com/github/gitignore 查找並根據自己情況修改使用

忽略文件的原則是:

1) 忽略操作系統自動生成的文件,比如縮略圖文件等
2) 忽略編譯生成的中間文件,可執行文件等,比如.pyc,.pyo文件等
3) 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件等

有時,某些被 .gitignore 忽略的文件又想添加到 Git 倉庫,那在 add 的時候需要添加 -f 選項,例如,

$ git add -f xxx.pyc

或者你認為是 .gitignore 裏哪個規則寫錯了,可以如下查看,

$ git check-ignore -v xxx.pyc

///////////////////////////////////////////////////////////////////////////////////////////

Git Alias

git config --global alias.st status : st 代替 status
git config --global alias.co checkout : co 代替 checkout
git config --global alias.ci commit : ci 代替 commit
git config --global alias.br branch : br 代替 branch

註:--global 是全局參數,也就是這些命令在這臺電腦的所有 Git 倉庫下都有用。

git config --global alias.unstage ‘reset HEAD‘ : unstage 代替 reset HEAD
git config --global alias.last ‘log -1‘ : last 代替 log -1
git config --global alias.lg ‘log --graph --pretty=oneline --abbrev-commit --color‘ : lg 代替……

變態配置:

git config --global alias.lgx "log --color --graph --pretty=format:‘%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset‘ --abbrev-commit" : lgx 代替……

另,

一般 global 配置內容放在每個 Git 倉庫的 .git/config 中 (但是 Win7 下好像沒有啊……,這個可能需要用戶手動編輯)
當前倉庫的配置文件放在當前倉庫根目錄下的 .gitconfig 中 (這個可能需要用戶手動新建)

///////////////////////////////////////////////////////////////////////////////////////////

搭建 Git 服務器

我們知道,GitHub 是一個免費開源代碼托管的遠程倉庫,但是不能免費建私有倉庫。
比如,公司中的代碼一般不能放在 GitHub 上,這時就要在公司建一個 Git 服務器作為私有倉庫使用。
搭建步驟如下,

1) 準備一臺 Linux 服務器,推薦用 Ubuntu 或 Debian
2) 安裝 git,用命令 $ sudo apt-get install git
3) 創建一個 git 用戶來運行 git 服務,用命令 $ sudo adduser git
4) 收集所有要登錄的用戶公鑰,即他們的 id_rsa.pub,把公鑰內容導入到 /home/git/.ssh/authorized_keys 文件,一行一個
5) 初始化 git 倉庫,在項目根目錄下例如 /srv,用命令 $ sydo git init --bare xxx.git

註:Git 就會創建一個裸倉庫,裸倉庫沒有工作區,因為服務器上的 Git 倉庫純粹是為了共享,所以不讓用戶直接登錄
到服務器上去改工作區,所以服務器上的 Git 倉庫通常是以 .git 結尾的一個文件。

6) 把 xxx.git 文件的 owner 改為 git,用命令 $ sudo chown -R git:git xxx.git
7) 禁用 shell 登錄,出於安全考慮,第3步創建的 git 用戶不允許登錄 shell,這可以通過編輯 /etc/passwd 文件來完成,
例如,
- 找到 git:x:1001:1001:,,,:/home/git:/bin/bash
- 改為 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣 git 用戶可以正常通過 ssh 使用 git,但無法登錄 shell

8) clone 遠程倉庫,用命令 $ git clone [email protected]:/srv/xxx.git , 然後就可以開始工作了。

-----------------------------------------------------------------------------------------------
管理公鑰
如果團隊很小,把每個人的公鑰收集起來放到服務器的 /home/git/.ssh/authorized_keys 文件裏就可以了。
如果團隊規模很大,可以用 Gitosis 來管理公鑰,這個就請 Linux 管理員幫助解決吧。
-----------------------------------------------------------------------------------------------
管理權限
對於有些視代碼為生命,並且視員工為竊賊的公司,會在版本控制系統裏設置一套完善的權限控制。每個人是否
有讀寫權限會精確到每個分支甚至每個目錄下。因為 Git 是為 Linux 源代碼托管而開發的,所以 Git 也就繼承了
開源社區的精神,不支持權限控制。
不過,因為 Git 支持鉤子(hook),所以,可以在服務器端編寫一系列腳本來控制提交等操作,達到權限控制的目的,
Gitolite 就是這樣的工具,這個也就請 Linux 管理員幫助解決吧。
----------------------------------------------------------------------------------------------


完。

----------------------------------------------------------------------------------------------------------------

吃水不忘挖井人,以上全部總結來自廖雪峰的官方網站。

Git 使用總結