版本控制工具之git

git存儲區域詳解

命令快速總結

初始化
	git init			當前文件夾初始化
代碼提交
	git add file/.		自動檢測工做區修改的內容提交到暫存區
	git status			查看當前文件夾工做區的狀態:是否有內容修改
	git commit -m '描述'	暫存區內容提交到倉庫
代碼回滾
	git checkout file				暫存區回滾到工做區
	git reset --hard '版本號'		回滾到指定版本的工做區
	git reset --soft '版本號'		將指定版本回滾到暫存區
	git reset --mix '版本號'		將指定版本回滾到修改過的內容
查看版本日誌
	git log						查看日誌信息:	命令(版本號)	做者	時間	版本描述
	git log --pretty=oneline	日誌信息:版本號	版本描述
	git reflog					日誌信息:版本號縮寫(7位)	HEAD(x)		命令	操做記錄

	注:git log: 若回滾到以前的版本,後面的版本將不會顯示	git reflog會顯示全部版本信息
刪除文件
	rm file
	git add/rm file
	git commit -m 'delete'
撤銷刪除操做
	rm file
	git checkout --file		回滾至修改前的狀態

	rm file
	git add file
	git reset HEAD file
	git checkout --file		回滾至提交到暫存區前的狀態
	
	rm file
	git reset --hrad '版本號'	回滾至指定版本號

第一階段:基礎命令

1. 初始化前端

git init 初始化,會生成一個.git文件, 全部版本信息都放在此文件

查看當前文件夾的狀態: git status

編輯代碼 ...

2. 提交代碼到暫存區 工做區 -> 暫存區vue

git add src 把代碼放入git 暫存區
# git add . 提交全部修改的文件
git status 此時剛纔add文件變成了綠色

3. 建立提交記錄(版本) 暫存區 -> 倉庫python

git commit -m '版本描述'	把代碼從暫存區放在git倉庫 stage->master
git config --user.email 1271570224@qq.com
git config --user.name zhangyafei
git commit -m 'vue第一個版本'

git status 此時已經爲空,表示提交的全部文件已經放在了git倉庫

4. 修改代碼:好比我修改了README.mdgit

git status 查看當前的代碼狀態
發現剛剛修改的文件變爲了紅色

5. 提交修改記錄github

git add .
git commit -m '修改README描述

6.git log 查看git日誌
輸出:命令(版本號),做者,時間,版本描述app

fei@home-fei MINGW64 /e/前端/vue/vue學習/vue_project/luffy (master)
$ git log
commit 1cf1f43ea1ed2767a5c1d0fbc1db4d071fdade7c
Author: 張亞飛 <1271570224@qq.com>
Date:   Wed Jan 23 10:47:56 2019 +0800

    完善README描述

commit 7866d35d2af1691705047127a620ab293f29f8f8
Author: 張亞飛 <1271570224@qq.com>
Date:   Wed Jan 23 10:39:25 2019 +0800

    vue第一個版本

7. git log --pretty=oneline
  輸出:版本號,版本描述ssh

fei@home-fei MINGW64 /e/前端/vue/vue學習/vue_project/luffy (master)
$ git log --pretty=oneline
1cf1f43ea1ed2767a5c1d0fbc1db4d071fdade7c 完善README描述
7866d35d2af1691705047127a620ab293f29f8f8 vue第一個版本

8. git reflog 查看全部版本操做
  輸出:版本號 修改順序(最近修改的在前)gitlab

fei@home-fei MINGW64 /e/前端/vue/vue學習/vue_project/luffy (master)
$ git reflog
1cf1f43 HEAD@{0}: reset: moving to 1cf1f43ea1ed2767a5c1d0fbc1db4d071fdade7c
7866d35 HEAD@{1}: reset: moving to 7866d35d2af1691705047127a620ab293f29f8f8
1cf1f43 HEAD@{2}: commit: 完善README描述
7866d35 HEAD@{3}: commit (initial): vue第一個版本

9. 回滾操做學習

  • git reset --hard HEAD^ 把把版本號回滾至上一個
  • git reset --hard 指定版本號(太長的能夠寫前六位) 回滾至指定的版本
$ git reset --hard 7866d35d2af1691705047127a620ab293f29f8f8
HEAD is now at 7866d35 vue第一個版本

$ git reset --hard 1cf1f43ea1ed2767a5c1d0fbc1db4d071fdade7c
HEAD is now at 1cf1f43 完善README描述

10. 修改代碼fetch

$ 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: src/App.vue

no changes added to commit (use "git add" and/or "git commit -a")

11. 撤銷修改
  修改過的內容 -> 上一次提交的狀態

  • git checkout file 回滾
  • git checkout readme 撤回對代碼作的修改,回滾到上一次提交的狀態 將代碼從工做區備份回滾到修改以前的狀態
$ 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: src/App.vue

no changes added to commit (use "git add" and/or "git commit -a")

fei@home-fei MINGW64 /e/前端/vue/vue學習/vue_project/luffy (master)
$ git checkout src/App.vue

12. 暫存區 -> 修改過的內容

git reset HEAD file

13. 提交的版本 -> 暫存區

git reset --soft 版本號

14. 提交的版本 -> 修改過的內容

git reset --mix 版本號

15. 提交的版本 -> 原內容 即回滾到指定版本號

git reset hard 版本號

16. 刪除一個文件並提交

rm file 本地刪除
git add/rm file 提交到暫存區
git coommit -m 'delete' 從倉庫刪除

17. 刪除一個文件 -> 撤銷刪除操做回到刪除前的狀態

rm file
git checkout -- file 撤銷修改

18. 刪除一個文件並提交至暫存區 -> 撤銷刪除操做並回滾至刪除前的狀態

rm file
git add/rm file 提交到暫存區 
git reset HEAD file ,從暫存區回滾到工做區
gir checkout -- file ,把工做區裏操做刪除回滾

 第二階段:分支協做

 情景再現:假設公司產品已經上線,要繼續研發功能,你正在研發一個新功能,此時線上產品出bug了,須要你立刻解決一下,或者臨時新功能到來,這時你會怎麼辦?

方式一:stash

  git stash:用於將工做區發生變化的全部文件獲取臨時存儲在「某個地方」,將工做區還原當前版本未操做前的狀態;stash還能夠將臨時存儲在「某個地方」的文件再次拿回到工做區。

git stash	將新增長的功能放到一個神奇的地方,代碼回到修改以前的狀態

開始解決bug
...
解決完問題並提交代碼,產品上線

git stash pop	將新增長的功能和現有代碼合併
注:此時會出現兩種狀況	1.順利合併	2.合併衝突,須要手動解決

衝突
	$ git stash pop
	Auto-merging README.md
	CONFLICT (content): Merge conflict in README.md
	
代碼
	<<<<<<< Updated upstream

	=======
			> bug
		- 新功能
	>>>>>>> Stashed changes

stash相關經常使用命令:

  • git stash 將當前工做區全部修改過的內容存儲到「某個地方」,將工做區還原到當前版本未修改過的狀態
  • git stash list 查看「某個地方」存儲的全部記錄
  • git stash clear 清空「某個地方」
  • git stash pop 將第一個記錄從「某個地方」從新拿到工做區(可能有衝突)
  • git stash apply 編號, 將指定編號記錄從「某個地方」從新拿到工做區(可能有衝突)
  • git stash drop 編號,刪除指定編號的記錄

git stash做用,幫助咱們暫時存儲已經開發一些功能的代碼,繼續作其餘事情,作完以後,再回來繼續開發

方式二:branch

git branch dev	建立一個新的dev分支
git checkout dev	你跳轉到dev分支開發新功能
git add .
git commit -m 'xxxx'

公司產品出現Bug

git branch master	跳轉到master分支
git branch dev2		建立一個dev2分支解決bug
git checkout dev2	找另外一我的跳轉到dev2分支解決bug
...		解決完bug
git add .
git commit -m '修改bug‘		提交代碼

git checkout master	跳轉到master分支
git merge dev2		將master與dev2分支進行合併

git branch -d dev2	刪除dev2分支

這個過程當中你能夠繼續在dev分支上進行開發,開發完成以後
git add .
git commit -m ’新功能完成'

git branch master
git merge dev	master分支與dev分支進行合併,發生衝突手動解決

branch常見命令

  • git branch 查看分支
  • git branch dev 建立分支dev
  • git checkout dev 跳轉到分支dev
  • git branch bug
  • git merge bug 合併分支bug
  • git branch -d bug 刪除分支bug

第三階段:代碼託管

情景再現:本身在家裏的電腦寫完代碼要帶到公司繼續開發,u盤?有風險

  • 須要一個代碼託管的網站:github、Bitbucket、碼雲
  • 本身建立一個代碼託管的網站:gitlab
  • 註冊帳號:
  • 用戶名:郵箱
  • 密碼:

將本地代碼上傳到github

前提:在github上建立一個項目,克隆遠程地址

git能夠是用該URL進行向遠程推送版本信息或獲取版本信息

git remote add origin https://github.com/zhangyafeii/rest_vue.git
# git pull --rebase origin master		代碼合併	可能須要
git push -u origin master	代碼推送到遠程master

git checkout dev		切換到dev分支
git push -u origin dev	將代碼推送到遠程dev分支

從遠程下載代碼到本地

git clone  https://github.com/zhangyafeii/rest_vue.git
注:默認只下載master分支

git pull origin dev	從遠程下載dev分支,直接下載到本地工做區。等於以上兩步
	- git fetch origin dev	從遠程下載到本地版本庫
	- git merge origin/dev	將本地版本庫與工做區合併	git rebase origin/dev	保持提交記錄的整潔
# git pull origin master
	# git fetch origin master
	# git merge origin/master

 場景模擬

回到家:
	git pull origin dev		從遠程下載dev分支
	修改代碼
	git add .
	git commit -m '描述'
	git push origin dev		將本地代碼上傳到遠程
	
去到公司
	git pull origin dev
	修改代碼
	git add .
	git commit -m '描述'
	git push origin dev

 第四階段:多人協同開發

1. 容許他人操做程序

  • - 合做者
  • - 建立組織

 

2. 分支

  • - master
  • - dev
  • - zhangyafei
  • - chenyun

情景模擬

開發功能初期
	員工A回到家
		git clone https://github.com/zhangyafeii/rest_vue.git
		git branch A
		git checkout A
		
		編寫代碼
		
		git add .
		git commit -m '描述'
		
		git push origin A
		
		這時遠程將會自動建立A這個分支
	
	員工B回到家
		git clone https://github.com/zhangyafeii/rest_vue.git
		git branch B
		git checkout B
		
		編寫代碼
		
		git add .
		git commit -m '描述'
		
		git push origin B
		
		這時遠程將會自動建立B這個分支
	
功能完成合並分支
	員工A
		git clone https://github.com/zhangyafeii/rest_vue.git
		git branch A
		git checkout A
		
		編寫代碼
		
		git add .
		git commit -m 'A功能開發完成'
		
		git push origin A
		
		# 第一個開發完成,首先合併比較輕鬆
		git checkout dev
		git merge A
		git push origin dev
		
	員工B
		git clone https://github.com/zhangyafeii/rest_vue.git
		git branch B
		git checkout B
		
		編寫代碼
		
		git add .
		git commit -m '描述'
		
		git push origin B
		
		# 注意:
		git checkout dev
		git merge B
		git push origin dev
		# 報錯
		$ git push origin dev
		To https://github.com/WuPeiqi/dbhot.git
		 ! [rejected]        dev -> dev (fetch first)
		error: failed to push some refs to 'https://github.com/WuPeiqi/dbhot.git'
		hint: Updates were rejected because the remote contains work that you do
		hint: not have locally. This is usually caused by another repository pushing
		hint: to the same ref. You may want to first integrate the remote changes
		hint: (e.g., 'git pull ...') before pushing again.
		hint: See the 'Note about fast-forwards' in 'git push --help' for details.
		
		# 第二個之後開發完成,得先拉下dev分支,而後在最新dev分支上合併,不然會報錯
		# 正確:
		git pull origin dev
		git checkout dev
		git merge B
		git push origin dev 

3. 規則

  • - 一塊兒合併
  • - 合併時間:1/2


4. 作代碼review

  • 如何作代碼review?

    - 建立review分支:

  • 誰來鎖代碼review?

- 組長
- 帶你的人

第五階段:給別人代碼貢獻力量

問題: 若是你要在github上給別人代碼添加功能?

  • fork
  • pull request

1. 不用反覆輸入用戶名密碼登陸

Https:
	https://用戶名:密碼@github.com/zhangyafei/rest_vue.git
	git remote add origin  https://用戶名:密碼@github.com/zhangyafei/rest_vue.git

SSH:
	git@github.com:WuPeiqi/dbhot.git
	
	前提:獲取ssh的key
	$ ssh-keygen.exe
	cd /c/Users/fei/.ssh

	fei@home-fei MINGW64 ~/.ssh
	$ cat id_rsa.pub
	ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDC7Aj9QiwzWu1tOheUSEFP2XQOZ57V8mjKIKufV7qVnWx/IEg7W4/8NzDAP51drpraJcJ+eYJvltrqQzUAwdkBKmtv+VaameRseoHLvHio3BLtiw35q8LuDH4L2f0DvCXpphISF9XGkr4rEgswbPFAG8tZwEjw6sm2uOyeCyfeZHDrZKbx/Xy/4Yz6wuPjWVUj65TdsmNtvu99xjTW84pKklDUN+EIErtWyUQqljwWiwqKfEqSFyEPfLJ+OTbGxldbt14eI2nfJvvhIw42TKkpeR7JTC4EPZpHszlj54XiGpavyLBwxPtkGHKR7W9vgC7ctq0qq5nXZud8FUJ7TdD/ fei@home-fei

2. gitignore文件 

  建立github項目的時候選擇gitignore python

3. 版本

git tag -a v1.0 -m '版本介紹' 本地建立Tag
git show v1.0 查看
git tags -n 查看本地Tag
git tag -l 'v1.4.2.*' 查看本地Tag,模糊匹配
git tag -d v1.0 刪除Tag
git push origin :refs/tags/v0.2 更新遠程tag
git checkout v.10 切換tag
git fetch origin tag V1.2

git push origin --tags
git pull origin --tagsgit clone -b v1.0 https://github.com/zhangyafeii/rest_vue.git
相關文章
相關標籤/搜索