1. 程式人生 > >git 快速上手(學習廖雪峰blog筆記)

git 快速上手(學習廖雪峰blog筆記)

git 學習

1. git add file1… 新增本地庫檔案到倉庫,未提交狀態

		git add -A  提交所有變化
		git add -u  提交被修改(modified)和被刪除(deleted)檔案,不包括新檔案(new)
		git add .  提交新檔案(new)和被修改(modified)檔案,不包括被刪除(deleted)檔案

2. git commit -m 一次提交新增的檔案們到倉庫


3. 版本修改


         diff 相關知識:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html 檔案修改後,git status 結果會提示 modified: readme.txt (該檔案被修改)是否要提交更新等 //diff difference git diff 檔名 結果提示:修改前檔案(-檔名)與修改後檔案(+檔名)的改動,'-'表示修改前的檔案或刪除的行,'+'反之。

//新增 提交   
git add file1
git commit -m <message>


4.時光穿梭


4.1版本回退 git reset --hard HEAD^

       Git中,用HEAD表示當前版本上個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。

注意:cmd控制檯中換行符預設是^,所以在cmd中會換行出現more,

	解決:		git git reset --hard HEAD~ //預設是一次
	    		或 git git reset --hard HEAD~1
		  	或 git git reset --hard "HEAD^"

解釋:git reset --hard commit_id 可以回到任意版本(快照), git log、git reflog 可檢視commit_id


4.2 管理修改

git操作的是修改! add 加入修改的進入暫存區,commit 提交暫存區進入分支。

忘記commit 只會提交暫存區的內容!
git diff 是你工作區跟stage的比較,這個時候可以看你開發過程中修改了哪些內容.
git diff --cached 是看你stage區和倉庫分支上的比較,你add後但是沒有commit, 這個時候只是在stage中,可以確認下修改是否正確,如果正確無誤可以commit合併到分支.


git diff HEAD – 檔名 是比較工作區與倉庫分支的區別,可以比較修改後與倉庫分支的該檔案的區別。
正常情況下 stage暫存區與倉庫分支 內容一致。

第一次修改後add,第二次修改後add,再一次提交會合並兩次修改。


4.3撤銷修改

場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout – file。
場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,

	第一步用命令git reset HEAD <file>,就回到了場景1,第二步按場景1操作。

場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠端庫。

4.4 刪除檔案與恢復

工作區中檔案被刪除也算是一次修改。
當工作區中檔案被刪除
有兩種情況:一、此檔案沒用所以被刪除,要在版本庫中刪除:命令git rm刪掉(git add也可以其相同作用,新增修改),並且git commit。
                      二、是誤刪,是可以在版本庫中恢復檔案,命令:git checkout – 檔名



5.遠端倉庫


5.1 本地新增遠端庫

github中新建倉庫,名稱如learngit; 本地新增遠端倉庫,命令$ git remote add origin [email protected]:malikcheng/learngit.git ,origin是遠端庫的名字,當然也可以改成別的,常規origin一看就知道是遠端庫;

下一步是把本地倉庫內容push(推送)到空白遠端庫:$ git push -u origin master,-u 引數是Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令;

以後本地做了提交,就可以通過命令$ git push origin master,把本地master分支的最新修改推送至GitHub

第一次使用到問題:Please make sure you have the correct access rightsand the repository exists 或Permission denied (publickey).

這是本地沒有許可權上傳到github賬戶上,需要配置ssh,將本地的公鑰放到GitHub的ssh key 裡面。

5.2 本地克隆遠端庫

		命令:git clone [email protected]:malikcheng/learngit.git
		
		git clone支援多種協議,除了HTTP(s)以外,還支援SSH、Git、本地檔案協議等,下面是一些例子;
		
		
		$ git clone http[s]://example.com/path/to/repo.git
		$ git clone http://git.oschina.net/yiibai/sample.git
		$ git clone ssh://example.com/path/to/repo.git
		$ git clone git://example.com/path/to/repo.git
		$ git clone /opt/git/project.git 
		$ git clone file:///opt/git/project.git
		$ git clone ftp[s]://example.com/path/to/repo.git
		$ git clone rsync://example.com/path/to/repo.git

6.分支管理


6.1 建立分支、合併分支、 刪除分支
		檢視分支:git branch
		建立分支:git branch <name>
		切換分支:git checkout <name>
		建立+切換分支:git checkout -b <name>
		合併某分支到當前分支:git merge <name>
		刪除分支:git branch -d <name>

6.2 衝突解決

當前分支與另一分支的檔案內容不一致時,用快速合併(git merge 分支名)到當前分支有衝突出現,需要手動解決衝突。

方法是:把git合併失敗的檔案編輯成我們希望的檔案,在提交。
merge 時錯誤資訊:
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
命令:git log --graph --pretty=oneline --abbrev-commit 檢視分支的提交情況,按時間排序

6.4分支管理策略

合併某分支到當前分支:git merge ,是快速合併模式,如果沒有衝突,只將head指標指向最後一次提交的當做master,這樣刪除分支後,會丟失分支資訊

新命令:git merge --no-ff -m ,禁用快速合併模式並生成commit資訊,這樣就能在log看到merge時的資訊

6.5 Bug分支

情景:以前上線版本或這其他以前負責的專案(只要符合修復bug內容和自己分支內容不衝突即可)出現了bug,緊急需要處理,但是自己在的dev分支工作還沒有完成,不能隨便切換分支哦 。

在自己dev分支使用git stash(儲藏)命令儲藏現在分支的未完結的工作進度。此時,就可以切換master分支,建issue分支來處理bug後 add、commit,到master分支merge,刪除issue分支;

到自己的dev分支,git stash apply(恢復儲藏的工作,stash儲存工作進度;git stash pop 恢復儲藏的工作,stash不記錄儲存 )。git stash list 查所有儲存工作進度。

git stash drop [stash_id] 刪除儲藏的進度。

小結:git stash 命令後,會隱藏當前進度。會回到上次提交後的狀態。

6.6 多人協作

開發中多個人會在自己本地分支關聯遠端庫master下dev分支,push自己的程式碼。
這時會遇到兩個人共同編輯一行程式碼,前一個人push成功,後一個人會push失敗。

相關命令:git fetch origin //重新整理遠端庫分支資訊

git clone [email protected]:michaelliao/learngit.git
				git checkout -b dev origin/dev //建立本地分支dev 與遠端庫下dev分支關聯
				E:\the other\learngit>git push origin dev  //push 時發生衝突
				To github.com:malikcheng/learngit.git
				 ! [rejected]        dev -> dev (non-fast-forward)
				error: failed to push some refs to '[email protected]:malikcheng/learngit.git'
				hint: Updates were rejected because the tip of your current branch is behind
				hint: its remote counterpart. Integrate the remote changes (e.g.
				hint: 'git pull ...') before pushing again.
				hint: See the 'Note about fast-forwards' in 'git push --help' for details.
				git pull //把最新的提交從origin/dev抓下來在本地合併,解決衝突,再推送
$ git pull //發生錯誤 原因是沒有指定本地dev分支與遠端origin/dev分支的連結,根據提示,設定dev和origin/dev的連結:
	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
$ git branch --set-upstream-to=origin/dev dev //本地dev與遠端dev建立連結


7. 標籤管理


7.1 建立標籤

標籤可以給每次的提交打上標籤,如果沒有指定commit id會指定當前的最新的一次提交。

命令 git tag tagname

列出所有tag git tag //不是按時間排序,是按字母排序

列出某標籤的資訊 git show tagname

刪除標籤 git tag -d tagname


7.2 操作標籤

標籤能在本地存也能推送到遠端庫存放

命令:git push origin tagname //一次推送一次標籤

git push origin tags //一次推送全部沒有推送過標籤們

推送到遠端庫刪除標籤比較麻煩,現在本地刪除標籤;然後,從遠端刪除。刪除命令也是push,但是格式如下:git push origin :refs/tags/v0.9

在所在的repository裡的releases裡可以看到標籤,地址https://github.com/MalikCheng(使用者名稱)/learngit(專案)/tags



最後補充幾個常用命令:

		git remote show 展示遠端庫的名字
		git show 		展示本地庫資訊
		git branch -m newname 將本地所在分支賦予新名字
		git branch -m oldname newname 指定要重新命名分支名字
		git remote rm origin 在本地倉庫刪除遠端倉庫
		git remote add origin [email protected]:malikcheng/learngit.git 新增遠端庫