2018年6月15日 星期五

Git 版本控管,寫程式的起手式

Git 版本控管,寫程式的起手式

什麼是Git?為什麼要用Git?

     Git是版本控制系統,專業一點說分散式版本控制系統,他就像我們玩遊戲的紀錄一樣,
可以讓你儲存當下的所有狀態,並且隨時切換到任何一個紀錄.我們之所以要使用Git是因為
他可以幫我們管理程式碼,在開發的過程中,所有的程式碼都有紀錄,可以隨時回到的某一
個版本或狀態,並且針對每次紀錄的修改都可以清楚地知道,修改了哪一個檔案哪一行,這對
於軟體開發非常的有用,可以參考

Git 常用指令

      網路上很多Git教學都寫得很好,我這邊就不多說只記錄我覺得常用的一些簡單觀念和指
令分享,主要還是讓自己未來可以有的地方回憶.


概念定義

  1. 工作目錄:Git會以一個資料夾當作工作目錄,目錄內的檔案都在git的範圍.
  2. 索引(Stage):所有檔案會先經過Stage在進入到Repository,也就是說你把要
    加入版空的檔案夾入到Stage,Git就會開始追蹤紀錄加入Stage的檔案.
  3. 數據庫(Repository):Git的資料庫,所以都版本紀錄都在這裡面.

安裝

Linux

Centos: sudo yum install git-all
Ubuntu: sudo apt-get install git-all

Mac

http://git-scm.com/download/mac

Windows

http://git-scm.com/download/win
http://git-for-windows.github.io/

初始化(init)

指令
說明
git init
初始化或創建
git clone remote repository
複製遠端Git檔案庫
git status
查看狀態

設定檔

通常在資料夾的.git資料夾(預設隱藏)裡的config檔案
指令
說明
git config --system -l
查看系統 config 設定
git config --global -l
查看全域 config 設定
git config -l
查到當前目錄下的 config 設定
git config user.name "user"
設定使用者名稱,在commit 時會使用這個名稱
git config user.email "user@okborn.com"
設定使用者 Email
git config --unset user.name
解除使用者名稱
git config alias.sh status
git config alias.cm commit
設定別名,設定完後
git sh  == git status  or git cm == git commit

查看歷史紀錄


指令
說明
git log
顯示commit節點歷史紀錄
git log --graph
顯示commit節點的演進圖
git log --oneline
顯示單行commit節點歷史紀錄
git log --all
顯示--all全部分支,
git log --decorate
顯示--decorate顯示分支名稱
git log HEAD
查詢任何分支的歷史紀錄

圖形介面


指令
說明
gitk
圖形檢視模式
gitk --all
圖形檢視模式,全部分支
git show HEAD
HEAD最新節點
git show HEAD~1
最新的前一個節點

版本差異查看


指令
說明
git diff
查看修改差異
git difftool
查看修改差異
pycharm version control
介紹


Git ignore 檔案

.gitignore 如果有一些檔案不想要加入版本控管,就可以把檔名加入到這個檔案檔案,
通常都要手動自己創建.Pyramid 常用會加入到.gitignore的檔案,
包含環境變數、.pyc檔案、log黨等.
.idea
env
*.egg-info
*.pyc
logs
static/*
.cache
.coverage
htmlcov

加入索引(Stage)


指令
說明
git add poem.txt
加入poem.txt到statge
git add .
全部加入stag
git add -u
被刪除和被修改的檔案加入到git索引
git add -A .
包含檔案刪除的都會更新到git檔案庫
-A:檢查資料夾是否有檔案被刪除

提交(Commit)


指令
說明
git commit -m "First commit"
提交並且寫備註

回復版本


指令
說明
git reset HEAD --soft
只有檔案庫裡的資料會變更,git
索引和資料夾的檔案都不會受影響
git reset HEAD --mixed
(預設)只有git 索引回復到指
定節點狀態,資料夾中的檔案不會受影響
git reset HEAD --hard
放棄這次的變更,回到最新的
版本,資料夾中的檔案全部回復到指定版本

刪除或更名檔案


指令
說明
git rm --cached poem.txt
參數--cached 只會從tracked清單中刪除,
不會刪除實際檔案
git reset HEAD poem.txt
已加入過staged先刪除檔案,
在下git add -A .會直接比對檔案和資料庫,
如果找不到檔案就會刪除檔案庫資料
git mv 原來檔名 新的檔名
修改檔名

分支(Branch)


指令
說明
git checkout poem.txt
檔名從 Git 檔案庫 取出檔案
git checkout -b develop
創建並切換到develop分支
git branch pellok commit xxx
開pellok分支從xxx節點,預設master分支
git checkout pellok
切換到pellok分支
git branch -d pellok
刪除分支必須切換到別的分支
git branch -m pellok
修改分支名稱,需再分支裡面
git checkout A
git merge B
在A分支合併B分支

分支合併

分支合併有兩個主要的觀念
  1. fast-forward merage (一定成功)(不會有新的commit) 常在單獨一個分支開發常遇到
  2. 3-way merge  (可能有有衝突)(有新的commit) 多人開發常遇到
在合併分支的時候,常常會有檔案有衝突的情況,以下是解決衝突會標記出來的地方

指令
說明
git cherry-pick commit xxx
合併commit
git cherry-pick --abort
取消合併
git cherry-pick --continue
解決衝突,繼續合併

<<<<<<< HEAD
=======
>>>>>>> pellok

版本標籤


指令
說明
git tag v1.0 commit
創建標籤,並更新到線上版本
git tag -d v1.0
刪除標籤

遠端Git資料庫

因為 Git 是分散式系統,所以有遠端和本地端的版本,可以單獨使用
指令
說明
git remote add new-repo
增加遠端Repostory
git remote rm new-repo
移除遠端Repostory
git remote rename
修改遠端名稱
git remote show
顯示遠端
git remote set-url new-repo
設定遠端Repository URL
git ls-remote
顯示遠端資料
git remote -v
遠端版本
git push new-repo --delete test


遠端GIT資料庫指令

基本上都是先 fetch 檢查兩邊的版本,在 pull 更新local端,最後在 push 更新遠端
指令
說明
git push
把本地版本更新到遠端版本
git push origin master
更新遠端的master
git push --set-upstream

git pull
把遠端版本更新到本地版本
git pull --rebase

git fetch
檢查遠端版本
git fetch --all
檢查所有的分支

搜尋關鍵字


指令
說明
git grep "member"
-i:不區分大小寫
-l:只要列出包含該字串的檔案
-c:每一個檔案中有幾行含有該字串
git grep -e "member" -e "account"

git grep -e "member" --and -e "account" --and,--or,()

git blame -L 起始行, 結束行, 檔案名稱
找每一行最後是由誰修改

暫時存擋

這個很常用,寫到一半的程式突然被要求修正Bug時,
可以先暫存目前的版本,


等修正完Bug後再回來繼續寫.
指令
說明
git stash save
暫時存擋
git stash list
列出暫存的列表
git checkout commit xxx
拿出暫存
git stash pop

git stash apply
拿出暫存

清理Git檔案庫


指令
說明
git rebase
清理Git檔案庫
git gc
--aggressive 詳細檢查及清理長時間
--auto 自動判斷是否需要清理
--no-prune 只要整理
git rebase master

git rebase --abort

git rebase --continue


多人協同製作


指令
說明
fork
複製整個  Repository
pull request
發出合併請求

Git ignore 移除不必要的環境檔


指令
說明
git rm --cached -r .idea
刪除檔案
git rm --cached -r env

git add .

git commit -m "remove .idea and env"


Git revert 針對已經提交過的Commit 做撤銷

Revert撤销一个提交的同时会创建一个新的提交。
这是一个安全的方法,因为它不会重写提交历史。
比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,
然后把这个提交加入項中。

指令
說明
git checkout hotfix

git revert HEAD~2


結論

Git 是非常方便的版本控制系統,自己很喜歡使用,習慣在一開始專案的時候就先加入Git,幾個觀念搞懂就很容易上手,尤其是有一些軟體輔助操作,像自己平常都使用SourceTree,很多的時候都是直接操作SourceTree來控制Git,只有在Server用到幾個簡單指令,git clone、git pull、git add、git commit、git push 等.


參考



沒有留言:

張貼留言

台灣人工智慧學校第四屆開學典禮

台灣人工智慧學校  第四屆 開學典禮       今天 AI 學校開學,非常特別像參加研討會一樣,開場介紹孔祥重校長和陳昇瑋執行長為什麼會創建這間學校,主要是他們發現AI技術可以幫助產業界解決很多問題,但是人才問題嚴重,希望透過一年三期每期500左右的規模並在北中南都有分校,來...