使用git
1. Git是什么?
Git是目前世界上最先進的分布式版本控制系統(沒有之一)
2. 安裝Git
2.1 linux安裝Git
debian或者Ubuntu Linux:sudo apt-get install git
如果是其他linux版本,可以直接通過源碼安裝。先從Git官網下載源碼,解壓,依次輸入:
./config, make, sudo make install
2.2 Windows上安裝Git
可以從官網上直接下載安裝程序,默認安裝即可,安裝完成會有Git Bash,類似一個linux命令行的窗口
3. 設置
安裝完成進行如下設置
$ git config --global user.name "your name"
$ git config --global user.email "email@example.com"
4. 創建版本庫
找到一個合適的地方,創建一個空的文件夾
mkdir learngit
cd learngit
pwd
通過git init 命令把這個目錄編程Git可以管理的倉庫
git init
會生成一個.git的目錄
5.把文件添加到版本庫
先創建一個文本文件如readme.txt,里面內容如下
it is a git test
將文件添加到倉庫
git add readme.txt
然后執行git commit 將文件提交到倉庫
git commit -m "add readme.txt"
通過命令git status可以查看倉庫的當前狀態
6. 查看修改的內容
修改文件readme.txt里的內容,執行git add 和git commit
然后通過git diff 可以查看修改的內容
7. 版本回滾
HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令
git reset --hard commint_id
穿梭前,可以用git log查看提交的歷史,以便確定要回退到哪個版本
要重返未來,用git reflog查看歷史命令,一邊確定回到未來的哪個版本
8.工作區和暫存區
8.1 工作區
就是在自己電腦里能看到的目錄
8.2 版本庫
工作區有一個隱藏目錄.git,這一個不算工作區,而是Git的版本庫
將文件網版本庫里提交的時候,分兩步執行
第一步:git add將文件添加進去,實際上就是把文件修改添加到暫存區
第二步:git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
9. 管理修改
Git跟蹤并管理的是修改,而不是文件
所以每次修改之后都要在提交前執行git add,如果git add之后,再修改文件git commit,第二次修改的內容將丟失
10. 撤銷修改
未執行git add之前可以使用git status查看,并執行git checkout -- file 可以丟棄工作區的修改
如$ git checkout -- readme.txt
如果執行了git add之后,再未提交之前,使用git reset HEAD
如 git reset HEAD readme.txt
11 刪除文件
在Git中,刪除也是一個修改操作,我們添加一個新文件test.txt到Git并且提交
執行rm test.txt
這個時候,執行git status查看,會告訴我們哪些文件被刪除了
現在可以有兩個選擇,一是確定從版本庫中刪除該文件
git rm test.txt并且執行git commit, 文件就從版本庫中刪除了
如果想恢復,可以執行git checkout -- text.txt從版本庫中恢復
12. 遠程倉庫
GitHub提供Git倉庫托管服務,先注冊的一個GitHub賬號
12.1 創建SSH Key
在用戶主目錄下執行ssh-keygen -t rsa -C "email@example.com"
會生成一個.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件
12.2登陸GitHub,打開“Account settings”, "SSH Keys"
點擊“Add SSH Key”,填上任意Title,在key文本框里粘貼id_rsa.pub文件的內容,點擊“Add Key”
12.3 創建一個遠程的倉庫
登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫例如spider
然后再本地執行命令
git remote add origin git@github.com:chenliang1995/spider.git
添加成功后,需要執行
git push origin master
把本地master分支的最新修改推送至GitHub
如果報錯為
Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts
需要將13.229.188.59 github.com添加到/etc/hosts中(linux)或者/c/windows/system32/drivers/etc/hosts(windows)
如若報錯為
refusing to merge unrelated histories
可以使用命令git pull origin master -allow-unrelated-histories強制將文件拉取到本地倉庫,再推送到遠程倉庫上
12.4 從遠程克隆
假若本地沒有倉庫,可以從遠程克隆
git clone git@github.com:chenliang1995/spider.git
同時,GitHub支持https,類似https://github.com/chenliang1995/spider.git這樣的地址
13 分支管理
13.1 創建與合并分支
- 一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點
- 每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長。
- 當我們創建一個新的分支,例如dev是,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。
- 不過從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次后,dev指針往前移動一步,而master指針不變。
- 假如我們在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合并。
合并分支后,甚至可以刪除dev分支,刪除dev分支就是把dev指針給刪掉,刪除后,我們就剩下一個master分支了
具體操作實戰:
git checkout -b dev
這條命令相當于
git branch dev和git checkout dev
-b參數表示創建并切換
列出所有分支,當前分支前面會標有一個*號
比如我們對readme.txt進行修改,加上一行
Creating a new branch is quick
然后提交
git add readme.txt
git commit -m "branch test"
現在,dev分支上的工作完成,我們就可以切換回master分支
git checkout master
可以發現文件readme.txt添加的內容不見了,因為剛才提交的是在dev分支上,而master分支此可的提交點并沒有發生改變
5 合并
現在我們把dev分支的工作成果合并到master分支上
git merge dev
這個命令用于合并指定分支到當前分支上,合并后,再查看readme.txt的內容,可以看到,和dev分支的提交是完全一樣的
合并完成后,就可以放心的刪除分支dev了
git branch -d dev
刪除后執行git branch查看分支,發現只剩下一個master分支
由于創建、合并和刪除分支非常快,所以Git鼓勵使用分支完成某個任務,合并后再刪除分支,這和直接在master分支上工作效果是一樣的,但更加安全
13.2 解決沖突
有時候,合并分支會出現異常比如:
git chechout -b featurel
修改readme.txt最后一行,改為
Creating a new branch featurel
在分支feature1分支上提交
git add readme.txt
git checkout master
在master分支上把readme.txt文件的最后一行改為
Creating a new branch is quick & simple
提交
git add readme.txt
git commit -m "& simple"
3 合并
git merge featurel
這種情況下,Git無法執行‘快速合并’,只能試圖把各自的修改合并器來,但這種合并就可能有沖突,
此時需要我們進行手動解決
git status可以告訴我們沖突的文件
Creating a new branch featurel
再提交
git add readme.txt
git commit -m "conflict fixed"
完成,git log --graph --pretty=oneline --abbrev-commit
可以查看合并情況
git branch -d featurel
工作完成
所以當Git無法自動合并分支是,就必須首先解決沖突,解決沖突后,再提交,合并完成,
用git log --graph命令可以看到合并圖
13.3 分支管理策略
git merge devGit會用Fast foward模式,但這種模式下,刪除分支后,會丟失分支信息
如果要強制禁用Fast foward模式,Git就會再merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息
git merge --no-ff -m "merge with no-ff" dev
因為合并要創建一個新的commit,所以加上-m參數,把commit描述寫進去
13.4 bug分支
- 當我們接到一個bug時,工作只進行到了一半,還沒辦法提交,預計完成還需一天時間,但是,必須再兩個小時內修復該bug,怎么辦?
- Git提供了一個stash功能,可以把當前工作現場“儲存”起來,等以后恢復現場后繼續工作
git stash - 現在,用git status查看工作區,就是干凈的(除非沒有被Git管理的文件),因此可以放心的創建分支來修復bug
- 首先確定在哪個分支上修復bug,假定需要在master分支上修復,就從master創建臨時分支
git checkout master
git checkout -b issue-101 - 現在修復bug,需要把redme.txt種的修改,然后提交
git add readme.txt
git commit -m "fix bug 101" - 修復完成后,切換到master分支,并完成合并,最后刪除issue-101分支
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101 - 可以了,bug修復完成,接著回到dev分支上干活
git checkout dev
git status - 工作區時干凈的,剛才的工作現場存到哪去了?用git stash list命令看看
git stash list - 工作現場還在,Git把stash內容存在某個地方了,但是需要修復一下,有兩個辦法
一是用git stash apply恢復,但是恢復后,stash內容并不刪除,你需要用git stash drop來刪除
另一種方法是用git stash pop,恢復的同時把statsh內容也刪除
再用git stash list查看,就看不到任何stash內容了 - 你可以多次stash,恢復的時候,先用git stash list查看,然后恢復指定的stash,用命令
git stash apply stash@{0}
13.5 Feature分支
軟件開發種,總有無窮無盡的新的功能要不斷添加進來,沒添加一個新的功能,我們會新建一個分支,在上面開發,文成后,合并,最后,刪除該feature分支。
當新建的分支提交之后準備合并時,如果不需要這個新功能,我們在執行
git branch -d feature時,Git會提醒,如果刪除,將丟失修改,
此時我們 需要執行git branch -D feature來進行強制刪除
13.6 多人協作
- 當我們從遠程克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默認名字時origin
要查看遠程庫的信息,用git remote
git remote
或者用git remote -v顯示更詳細的信息
git remote -v
上面顯示了可以抓取和推送的origin的地址,如果沒有推送權限,就看不到push的地址 - 推送分支
推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上
git push origin master
如果要推送其它分支,比如dev,就改成
git push origin dev - 但是,并不是一定要把本地分支往遠程推送,那么,哪些分支需要推送,哪些不需要?
mster分支是主分支,因此要時刻與遠程同步
dev分支是開發分支,團隊所有隊員都需要在上面工作,所以也需要與遠程同步
bug分支只要與在本地修復bug,就沒必要推到遠程了
feature分支是否推到遠程,取決于你和你的小伙伴合作在上面開發
13.7 抓取分支
多人協作時,大家都會往master和dev分支上推送各自的修改
現在,模擬一個你的小伙伴在另一臺電腦或者同一臺電腦的另一個目錄下克隆
git clone git@github.com:chenliang1995/spider.git
當你的小伙伴從遠程庫clone時,默認情況下,你的小伙伴只能看到本地的master分支
現在,你的小伙伴要在dev分支上開發,就必須創建遠程origin的dev分支到本地,于是他用這個命令創建本地dev分支
git checkout -b dev origin/dev
現在,他就可以在dev上繼續修改,然后,時不時把dev分支push到遠程
git add env.txt
git commit -m "add env"
當他已經向origin/dev分支推送了他的提交時,而碰巧你也對同樣的文件做了修改,并視圖推送
git add env.txt
git commit -m "add new env"
git push origin dev
推送失敗,因為你的小伙伴的最新提交和你視圖推送的提交有沖突,此時我們可以用git pull把最新的提交從origin/dev抓下來,然后,在本地合并,解決沖突,再推送
git pull
失敗了,根據提示,設置dev和origin/dev的鏈接
git branch --set-upstream-to=origin/dev dev
再pull
git pull
返回git pull成功,但是合并有沖突,需要手動解決,解決后,再push
14 標簽管理
14.1 創建標簽
git中打標簽非常簡單,首先切換到需要打標簽的分支上
git checkout master
然后敲命令git tag <name>就可以打一個新的標簽
git tag v1.0
可以用命令git tag來查看標簽
默認標簽是打在最新提交的commit上的,有時候,如果忘了打標簽,可以通過提交的commit id打
git log --pretty=oneline --abbrev-commit
git tag id
還可以創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字
git tag -a v0.1 -m "version 0.1 released" id
注意,標簽總是和某個commit掛鉤,如果這個commit既出現在master分支,又出現在dev分支,那么這兩個分支上都可以看到這個標簽
14.2 操作標簽
如果標簽打錯了,也可以刪除
git tag -d v0.1
如果要推送某個標簽到遠程
git push origin <tagname>
或者,一次性推送全部尚未推送到遠程的本地標簽
git push origin --tags
如果標簽已經推送到遠程,要刪除遠程標簽就得先從本地刪除
git tag -d v0.9
然后從遠程刪除
git push origin :refs/tags/v0.9
查看是否真的從遠程庫中刪除了標簽,可以登陸GitHub查看
轉載于:https://www.cnblogs.com/chenliang0309/p/10050652.html
總結
- 上一篇: 2015-2016 Petrozavod
- 下一篇: Mac os硬盘空间释放