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 添加遠程庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章