1、克隆一份項目代碼
$ git clone git@github.com:akun/pm.git
2痴脾、有一個新項目是由你發(fā)起的颤介,你要將初始化的項目工程放到 Git 版本倉庫中
$ mkdir pm
$ cd pm
$ git init
$ touch README.md
$ git add README.md
$ git commit
3梳星、Git 是分布式的版本控制系統(tǒng)赞赖,所以剛才的操作滚朵,算是已經(jīng)在你本地版本控制起來了,為了推送本地倉庫到遠(yuǎn)程倉庫前域,就還得執(zhí)行:
$ git remote add origin git@github.com:akun/pm.git
$ git push -u origin master
4辕近、一般這個時候都會設(shè)置下~/.gitconfig或.git/config中的配置,最基本的就是用戶名和郵箱匿垄。
確認(rèn)當(dāng)前的 Git 配置信息:
$ git config --list
設(shè)置用戶名和郵箱:
$ git config user.name akun
$ git config user.email admin@example.com
5移宅、剛才的命令只是對.git/config生效,如果想全局生效椿疗,也就是~/.gitconfig漏峰,就得加上--global參數(shù),比如:
$ git config --global user.name akun
$ git config --global user.email admin@example.com
6届榄、開始一天的工作浅乔,首先更新工作目錄:
$ cd ~/projects/pm
$ git checkout develop? # 我想在 develop 分支上開始一天的工作
6.1、更新方式一:
$ git fetch --all? # 從遠(yuǎn)程倉庫獲取所有分支的代碼變更
$ git merge
6.2铝条、更新方式二:
$ git fetch --all
$ git rebase? # 默認(rèn)就衍合 develop 分支的代碼了
6.3靖苇、更新方式三:
$ git pull? # 懶得理解 fetch 和 merge 就直接 pull 吧
7、修改
7.1班缰、可能你寫了一個新的模塊贤壁,需要納入項目的版本控制:
$ git add tools.py
7.2、可能你發(fā)現(xiàn)某個模塊已經(jīng)陳舊了埠忘,不再使用了:
$ git rm utils.py
7.3脾拆、可能你發(fā)現(xiàn)一個模塊的命名不太合理,需要改名:
$ git mv model.py models.py
7.4莹妒、可能你要創(chuàng)建一個新的較大的模塊假丧,需要?dú)w檔為目錄的方式:
$ mkdir groups
$ touch groups/__init__.py
$ git add groups/__init__.py
7.5、可能你發(fā)現(xiàn)要寫的模塊代碼布局類似于舊的模塊动羽,直接復(fù)制個代碼模版:
$ cp users/tests.py groups/tests.py
$ git add groups/tests.py
8包帚、檢查
一個任務(wù)完成了,這個時候一般會將代碼更新到版本倉庫(分為本地版本倉庫和遠(yuǎn)程版本倉庫)运吓。
8.1渴邦、習(xí)慣上會先檢查下修改狀態(tài):
$ git status
8.2、看到一些 Git 狀態(tài)信息拘哨,確認(rèn)是修改了哪些文件谋梭,之后一般會自己 code review 一下代碼的改動,可能有的人會習(xí)慣直接用 Git 方式來查看:
$ git diff
8.3倦青、這里的 diff 只是查看其中“工作目錄”和“暫存區(qū)域”的區(qū)別瓮床。要查看“暫存區(qū)域”和“本地倉庫”的區(qū)別,可以用:
$ git diff --staged? # 或 git diff --cached
工作目錄:git clone 后獲得的一份本地的代碼,也包括新編輯的隘庄,尚未加入版本控制的代碼
暫存區(qū)域:git add 后暫存起來踢步,尚未 git commit 的代碼
本地倉庫:git commit 后正式被版本控制記錄起來的代碼
然后本地運(yùn)行下相關(guān)的單元測試,確認(rèn)是否有問題丑掺。一般來說這個時候获印,沒有什么特殊情況,就直接進(jìn)入“提交”甚至是“推送”階段了街州,然后結(jié)束一個工作日或工作周期兼丰,但難免會有些特殊情況出現(xiàn)。
9唆缴、取消修改
當(dāng)你 code review 完后鳍征,發(fā)現(xiàn)有些改動不滿意;或者運(yùn)行完單元測試面徽,發(fā)現(xiàn)有些測試用例沒通過蟆技,你可能會進(jìn)行取消這些修改的操作。
9.1斗忌、如果還沒 add质礼,那么可以:
$ git checkout -- main.py
9.2、為了避免剛好跟分支名重合织阳,所以加了兩個斜杠(雖然概率很低)眶蕉,如果已經(jīng) add 了,但還沒 commit唧躲,那么可以:
$ git reset HEAD main.py
9.3造挽、萬一剛提交完畢,也就是已經(jīng) commit 了弄痹,才發(fā)現(xiàn)代碼有問題饭入,比如:忘記把某個文件提交了,這個時候咋辦肛真?Git 好處是可以覆蓋上一次提交谐丢,那么可以:
$ git add tests.py
$ git commit --amend
上面還只是簡單的撤銷操作,Git 還能支持更高級的重寫歷史功能蚓让,想掌握高級技能的可以實踐下這個文檔:Git-工具-重寫歷史
10乾忱、解決沖突
有時候同別人合作寫一個模塊的代碼,會把對方代碼合并或衍合過來历极,比如:對方修復(fù)了某個缺陷窄瘟,你剛好也需要這個修復(fù);再比如:對方完成了某個特性趟卸,你也剛好需要用下這 個特性等等各種情況蹄葱。
10.1氏义、第一種是合并操作時候有沖突:
$ git fetch --all
$ git merge bugfix/remove_error
# 這個時候就提示你代碼沖突了,處理完沖突的代碼后
$ git diff? # code review 下代碼
$ git add remove.py
$ git commit
# 日志中就多了一條合并操作的日志了
10.2图云、另一種是衍合操作時有沖突:
$ git fetch --all
$ git rebase bugfix/remove_error
# 這個時候就提示你代碼沖突了惯悠,處理完沖突的代碼后
$ git diff? # code review 下代碼
$ git rebase --continue? # 有時候會 git rebase --skip
# 直到不用再 rebase 為止
這里也提下直接合并本地分支,有時候你創(chuàng)建的分支只是自己用用琼稻,沒有共享給別人,因為本地已經(jīng)有了這份分支代碼了饶囚,那么就省去gitfetch操作帕翻,類似上述方式合并或衍合代碼就行。
11萝风、刪除分支
如果確認(rèn)工作完畢的分支不再需要了嘀掸,那就記得及時清理掉。
11.1规惰、刪除遠(yuǎn)程分支:
$ git push origin :features/batch_remove
11.2睬塌、刪除本地分支:
$ git branch -d features/batch_remove
11.3、一段時間后歇万,一定有一堆別人的分支揩晴,然后你gitfetch下來了,這樣就出現(xiàn)在本地的分支清單中贪磺,但遠(yuǎn)程版本庫中已經(jīng)刪除了硫兰,如果想本地分支清單干凈些,可以在gitfetch時候這樣執(zhí)行:
$ git fetch --all -p
12寒锚、沖突情景
12.1劫映、有時候合并或衍合代碼,但本地有修改了一半的代碼沒有提交刹前,可以先暫存起來:
$ git stash
# 合并或衍合完畢代碼后
$ git stash pop? # 恢復(fù)剛才修改了一半的代碼
12.2泳赋、如果需要保留本地修改,直接pull網(wǎng)絡(luò)代碼(不commit)
git stash -> git pull -> git stash pop -> 解決沖突 -> 繼續(xù)編輯 ->(如果有warning提示未解決沖突,則git add -u ) -> git commit (需要提交的話) -> git push
12.3喇喉、如果需要直接提交Commit
git commit -> git pull -> 解決沖突 -> (如果有warning提示未解決沖突,則git add -u )-> git commit -> git push
Q祖今、git倉庫刪除所有提交歷史記錄,成為一個干凈的新倉庫
1.Checkout (git checkout --orphan latest_branch)
2. Add all the files (git add -A)
3. Commit the changes (git commit -am "commit message")
4. Delete the branch (git branch -D master)
5.Rename the current branch to master (git branch -m master)
6.Finally, force update your repository (git push -f origin master)