Git的基本使用
關(guān)于Git官網(wǎng)提供的《pro git》應(yīng)該是最全面,最權(quán)威的使用手冊(cè)了。關(guān)于Git的具體概念,來(lái)源,使用等都可以去里查閱學(xué)習(xí)。本文的目的是從零開(kāi)始以演示Git在實(shí)際項(xiàng)目中的一些基本應(yīng)用,以幫助讀者快速上手。
本文默認(rèn)讀者數(shù)量使用window系統(tǒng)且對(duì)命令行操作有一定了解。
要完成的文章內(nèi)容:
- Git的安裝
- Git本地倉(cāng)庫(kù)的建立
- Git克隆,拉取,合并,推送
- Git分支創(chuàng)建,分支之間的合并
- Git遠(yuǎn)程倉(cāng)庫(kù),遠(yuǎn)程分支拉去,本地和遠(yuǎn)程的對(duì)應(yīng)關(guān)系,本地與遠(yuǎn)程的對(duì)應(yīng)關(guān)系綁定
- 筆記里面其他的關(guān)于Git命令
- git stash 保存修改的東西到緩存,然后拉去代碼之后再把緩存的東西釋放出來(lái)
Git安裝
在Linux上安裝
如果要在 Linux 上安裝預(yù)編譯好的 Git 二進(jìn)制安裝包,可以直接用系統(tǒng)提供的包管理工具。在 Fedora 上用 yum 安裝:
$ yum install git-core
在 Ubuntu 這類(lèi) Debian 體系的系統(tǒng)上,可以用 apt-get 安裝:
$ apt-get install git
在Mac上安裝
在 Mac 上安裝 Git 有兩種方式。最容易的當(dāng)屬使用圖形化的 Git 安裝工具,界面如圖 1-7,下載地址在:
http://sourceforge.net/projects/git-osx-installer/

另一種是通過(guò) MacPorts (http://www.macports.org) 安裝。如果已經(jīng)裝好了 MacPorts,用下面的命令安裝 Git:
$ sudo port install git-core +svn +doc +bash_completion +gitweb
這種方式就不需要再自己安裝依賴庫(kù)了,Macports 會(huì)幫你搞定這些麻煩事。一般上面列出的安裝選項(xiàng)已經(jīng)夠用,要是你想用 Git 連接 Subversion 的代碼倉(cāng)庫(kù),還可以加上 +svn 選項(xiàng),具體將在第八章作介紹。(譯注:還有一種是使用 homebrew(https://github.com/mxcl/homebrew):brew install git。)
在Windows上安裝
在 Windows 上安裝 Git 同樣輕松,有個(gè)叫做 msysGit 的項(xiàng)目提供了安裝包,可以到 GitHub 的頁(yè)面上下載 exe 安裝文件并運(yùn)行:
http://msysgit.github.com/
完成安裝之后,就可以使用命令行的 git 工具(已經(jīng)自帶了 ssh 客戶端)了,另外還有一個(gè)圖形界面的 Git 項(xiàng)目管理工具。
Git的基本操作
注意:以下演示用git對(duì)txt文檔進(jìn)行版本的跟蹤,每次對(duì)txt文件修改或者回滾后注意跟新txt內(nèi)容。建議使用notpad打開(kāi)txt文件,它會(huì)自動(dòng)監(jiān)控內(nèi)容改變并且提示更新。
本地倉(cāng)庫(kù)操作示例
初始化新倉(cāng)庫(kù)
在D盤(pán)根目錄創(chuàng)建名稱(chēng)為git的文件夾,接下來(lái)把該文件夾做成本地的git倉(cāng)庫(kù)并進(jìn)行一些基本的操作。
安裝好git軟件之后,進(jìn)入git文件夾,在空白處點(diǎn)擊鼠標(biāo)右鍵,選擇Git Bash Here.
執(zhí)行:
zhangmumu@zhangmumu MINGW64 /d/git
$ git init
Initialized empty Git repository in D:/git/.git/ # 這里顯示新增了.git文件
初始化后,在當(dāng)前目錄下會(huì)出現(xiàn)一個(gè)名為 .git 的目錄,所有 Git 需要的數(shù)據(jù)和資源都存放在這個(gè)目錄中。不過(guò)目前,僅僅是按照既有的結(jié)構(gòu)框架初始化好了里邊所有的文件和目錄,但我們還沒(méi)有開(kāi)始跟蹤管理項(xiàng)目中的任何一個(gè)文件。
查看狀態(tài)
當(dāng)前目錄建立文件git-test.txt里面錄入內(nèi)容:first Content。如上該文件第一次編輯結(jié)束,保存一下。
執(zhí)行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status # 查看目前狀態(tài)(status)經(jīng)常使用的命令
On branch master #目前所在分支,處于master主分支,后續(xù)會(huì)提到分支的操作
No commits yet #目前沒(méi)有任何提交(commits)
Untracked files: #提示有文件沒(méi)有跟蹤,并且提示下一步怎么操作
(use "git add <file>..." to include in what will be committed)
git-test.txt
nothing added to commit but untracked files present (use "git add" to track)
增加跟蹤
執(zhí)行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add git-test.txt
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: git-test.txt
執(zhí)行git add *之后并沒(méi)有返回。再執(zhí)行git status查看當(dāng)前狀態(tài),狀態(tài)中可以看到新增了一個(gè)文件,等待提交(commit),并且提示可以通git rm --cached <file>去unstage該文件。
stage直接翻譯是階段的意思,git中的stage我理解成暫存,add文件之后是加入了git的暫存區(qū)。
提交文件
執(zhí)行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git commit -m "fist-commit" #提交命令,-m 之后的字符串是對(duì)本次提交的備注內(nèi)容
[master (root-commit) 7368c19] fist-commit
1 file changed, 1 insertion(+) #顯示文件增加了一行內(nèi)容
create mode 100644 git-test.txt
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
nothing to commit, working tree clean
git commit -m " "提交命令,-m之后是輸入對(duì)本次提交的備注內(nèi)容。
提交記錄
查看提交的記錄,執(zhí)行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git log
commit 7368c19dc88ca2062b3c24a25334a9ce04824b2c (HEAD -> master)
Author: zhangmumu
Date: Sat Sep 8 08:48:34 2018 +0800
fist-commit
以上顯示目前僅僅有一次提交內(nèi)容。
舍棄修改
在日常文件編輯中,有時(shí)候想放棄當(dāng)前修改回到當(dāng)前git版本中樣子。git-test.txt文件中的做任意的修改,修改之后想放棄這次修改。
執(zhí)行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status #查看狀態(tài)可以看到文件有修改內(nèi)容
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: git-test.txt
no changes added to commit (use "git add" and/or "git commit -a")
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git checkout * # 撤銷(xiāo)當(dāng)前修改,git是支持正則的
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status #再次查看狀態(tài),干凈的,修改已經(jīng)被撤銷(xiāo)
On branch master
nothing to commit, working tree clean
如果文件已經(jīng)增加到了stage(暫存區(qū)),怎么回滾?再次對(duì)文檔進(jìn)行任意修改,執(zhí)行:
# 修改文件后查看狀態(tài)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ 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: git-test.txt
no changes added to commit (use "git add" and/or "git commit -a")
# 文件add增加到暫存區(qū)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add *.txt
# 再次查看狀態(tài)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: git-test.txt
# git rest HEAD 命令將暫存區(qū)的文件unstage撤出暫存區(qū)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git reset HEAD *
Unstaged changes after reset:
M git-test.txt
# 再次查看狀態(tài),文件已經(jīng)撤出暫存區(qū)域,checkout一下就可以撤銷(xiāo)本次修改了
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ 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: git-test.txt
no changes added to commit (use "git add" and/or "git commit -a")
以上的操作消化吸收之后,基本上是入門(mén)了。下面做一個(gè)服務(wù)器倉(cāng)庫(kù)的實(shí)際操作。
遠(yuǎn)程服務(wù)器操作
目前很多網(wǎng)站提供git平臺(tái)進(jìn)行代碼托管的,這里推薦碼云它的文檔中說(shuō)的很詳細(xì)了。碼云提供的GIT大全包含了Git插件、客戶端、瀏覽器插件、文檔、常用指令等等。
在日程使用中,感覺(jué)遠(yuǎn)程服務(wù)器拉去代碼與本地操作相比較多了push和pull操作,前者是將本地的代碼推送到遠(yuǎn)程服務(wù)器,后者是將遠(yuǎn)程的代碼拉去到本地。
基本配置
碼云中Git的基本配置說(shuō)的很明白,本地配置用戶名和郵箱之后需要生成并部署SSH KEY用來(lái)讓遠(yuǎn)程項(xiàng)目識(shí)別你的訪問(wèn)權(quán)限,每臺(tái)電腦會(huì)生成自己的key,將key加入到自己的賬號(hào)設(shè)置之后,電腦有訪問(wèn)遠(yuǎn)程服務(wù)器的權(quán)限。
拉取遠(yuǎn)程代碼
通常遠(yuǎn)程代碼地址有兩種
- HTTPS的,類(lèi)似這樣:
https://gitee.com/zhangmumu_star/[項(xiàng)目名稱(chēng)].git - SSH的,類(lèi)似這樣:
git@gitee.com:zhangmumu_star/[項(xiàng)目名稱(chēng)].git
建議使用SSH地址,HTTPS拉去的時(shí)候需要輸入自己的碼云賬號(hào)和密碼,而SSH則不需要。
在本地建立好工作目錄之后,打開(kāi)git bash,拉去代碼命令:
$ git clone git@gitee.com:zhangmumu_star/[項(xiàng)目名稱(chēng)].git
建立本地分支
建立本地分支且切換到本地分支:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (master)
$ git checkout -b zz #建立本地分支并且切換到該分支命令
Switched to a new branch 'zz'
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch #查看分支,目前已經(jīng)在zz分支上面
master
* zz
分支合并
剛剛從master分支中建立的分支zz是跟master一模一樣的。
如果A分支跟B分支內(nèi)容上有不一樣的話,希望把B分支內(nèi)容跟A分支合并。那么就切換到B分支然后執(zhí)行合并命令:
git checkout B #切換到B分支
git merge A #目前位于B分支,mergeA的意思就是把A分支內(nèi)容合并到B分支
查看本地分支與遠(yuǎn)程分支映射關(guān)系
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv
master 5cdaf1a [origin/master] commit
* zz 5cdaf1a commit
映射關(guān)系命令為:Git branch -vv。其中返回結(jié)果中origin表示遠(yuǎn)程的意思,本地的master分支與遠(yuǎn)程的master分支是有映射關(guān)系的。本地的zz分支并沒(méi)有與遠(yuǎn)程的分支有映射關(guān)系。
將本地分支推送到遠(yuǎn)程
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git push origin zz:zz #將本地分支推送到遠(yuǎn)程
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by Gitee.com
To gitee.com:zhangmumu_star/framwork_test.git
* [new branch] zz -> zz
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv #查看對(duì)應(yīng)關(guān)系
master 5cdaf1a [origin/master] commit
* zz 5cdaf1a commit
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -a #查看遠(yuǎn)程分支
master
* zz
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/zz
可以看到本地分支已經(jīng)推送到了遠(yuǎn)程,但是本地分支跟遠(yuǎn)程分支并沒(méi)有映射關(guān)系。沒(méi)有映射關(guān)系的時(shí)候在推送和拉去代碼的時(shí)候必須指定好本地分支和遠(yuǎn)程分支,如下:
git pull <remote> <branch> #制定本地分支和遠(yuǎn)程分支
git push <remote> <branch>
指定的意思就是,把本地分支<branch>推送到遠(yuǎn)程分支<remote>中。反向拉去的時(shí)候意思一樣。
建立映射關(guān)系
在本地分支和遠(yuǎn)程分支沒(méi)有映射關(guān)系的時(shí)候拉去代碼會(huì)有如下提示:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ 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> zz
建立映射關(guān)系:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -u origin/zz #建立映射關(guān)系
Branch 'zz' set up to track remote branch 'zz' from 'origin'.
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv #查看映射關(guān)系
master 5cdaf1a [origin/master] commit
* zz 5cdaf1a [origin/zz] commit
此外也可以使用上面提示的語(yǔ)句建立映射關(guān)系:
git branch --set-upstream-to=origin/<branch> zz
# 上面的<branch>指的是遠(yuǎn)程分支的名,zz指的是本地分支名
拉取到本地
在已經(jīng)克隆了代碼并且做好映射關(guān)系之后,將代碼拉取到本地的方法:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git pull
Already up to date.
提交到遠(yuǎn)程
跟本地<a href="#提交文件">提交文件</a>的區(qū)別是,在依次執(zhí)行完add,commit命名之后需要執(zhí)行push命令來(lái)將本地的代碼提交到遠(yuǎn)程。