Git 有什麼奇技淫巧?
git bisect
有沒有過寫了一天的代碼,checkin無數,結果突然發現之前沒注意的地方break的時候?
這個時候要在茫茫commits里尋找那個錯誤的commit是多麼的痛苦啊。`git-bisect`就是大救星!
git-bisect本質上就是一個二分法,用起來也很簡單:git bisect start #start
git bisect bad #current branch is bad
git bisect good &
然後只要不停的告訴git當前commit是不是好的,
git bisect good
或者
git bisect bad
就能找到罪魁禍首了!
1. 在嘗試過所有命令都不能把你從深淵裡挽救出來的時候,git reflog 也許能救你一命。
比如撤銷一次 rebase(rebase 可是會直接修改歷史的,一定要了解原理後再使用) Undoing a git rebase
2. 每次 merge 完總是出現很多 .orig 文件,使用 git clean -f 幹掉所有 untracked files
3. rebase 一個 diverged 分支一直要解決衝突很痛苦,可以嘗試在自己的分支先 squash 一下,git rebase -i,然後再 rebase 主幹,解決一次衝突就 ok 了
4. 本地有很多其實早就被刪除的遠程分支,可以用 git remote prune origin 全部清除掉,這樣再 checkout 別的分支時就清晰多了上面有答主提到過rebase的用法,正好最近用到了這個指令,那我就分享一下我在解決衝突時對git rebase的用法吧~
場景還原一下:我在stash里提交了一個pull requst,但我的branch還沒有到merge到develop上的時候,就有另一個和我修改了同一個文件的branch被合併到了主支。那麼現在我的分支就會出現conflict,必須得解決衝突後才能進行下一步的merge操作。
那麼我們先假設,我創建的分支叫"ling_long" 先被合併到主支develop上即別人創建的分支叫"xie_seng" (。。。我不管我的分支就要叫這個名字。。我以往的做法是:
1.先切換到主支develop上,pull下最新的代碼。2.然後切換到我的分支,並將develop merge到我的分支上。3.這個時候就會出現conflict提示,再根據提示解決conflict,merge成功進行。4.最後將合併過的分支commit到遠程。畫一張圖描述一下:
分支「ling_long"在圖中標示為」玲瓏「分支「邪僧」在圖中標示為「邪僧」感覺描述起來的話中文比英語好區分。。。從下往上看起:
我們可以看到我創建了一個名為「玲瓏」的branch,修改了zhihu.js文件並進行了兩次commit團隊中其他的人創建了一個名為「邪僧」的branch,同樣修改了zhihu.js文件並進行兩次commit。這時候「邪僧」優先被merge進了develop,這個時候,「玲瓏」就會被提示出現confict。如果按照上文描述的方法進行pull然後merge的話,我們可以看到「邪僧」的分支上的所有commit記錄會被合併到「玲瓏」身上。這個時候玲瓏再進行commit的時候就會將「邪僧」的commit記錄一起提交上去。這樣的話,不僅不利於code reviewer審查代碼,也會讓記錄變得凌亂不幹凈。那麼這個時候,利用rebase這個指令的優勢就會體現出來。1.
$ git fetch origin develop
拉下遠端develop更新
2.$ git checkout ling_long
切換到自己的分支
3.$ git rebase -i develop
rebase ling_long 分支到develop上
4.解決衝突5.$ git add app/lalala/zhihu.js
git add 修改後的文件
6.$ git diff -cached
可以檢查一下代碼變更的部分
7.$ git rebase --continue
8.
$ git push -f origin ling_long:ling_long
強行更新ling_long branch
繼續用圖直觀地看一下:
$ git rebase -i develop
其實你會進入vim模式,如果你在ling_long上有兩次commmit,如果第二次commit是對第一次commit的補充,你可以根據上面的提示進行合併,一般就是把pick改成s就可以。這個具體情況具體分析吧,我就不多描述啦。
如果有不對的地方還望前輩們多多指正。謝邀。
我的git水平很菜,寫個回答,希望能拋磚引玉吧。1. git add -p
以前我git add的時候,經常會把一些本地的用於調試的代碼add進去(比如console.log之類的),git add -p可以一段一段地add,每一段都會問你要不要添加(y/n?)。2. git rebase -i
有的時候出現臨時需求,需要切換分支。本地完成一半的工作會commit成一個temp save。git rebase -i 可以修改、增加、刪除、合併任意的commit。3. git diff master...
注意,是3個點,不是2個點。新開發一個功能,會創建一個新的branch。在開發新的branch的期間,master也會增加很多代碼。如果用2個點進行diff,會把master的新增代碼顯示出來。用3個點進行diff,只會顯示當前分支與master的最近公共祖先與當前分支的差異。4. git push -u如果當前分支沒有設置過track,這個命令會在push的同時,設置track。Branch feature_xxx set up to track remote branch feature_xxx from origin.
有了track,有3個好處。
- git status的時候可以顯示領先/落後的多少個commit。
- git push的時候可以省略後兩個參數。
- git pull的時候可以省略後兩個參數。
git blame,緝兇利器
寫了一個bash自動創建git aliases,省的在terminal里一個一個打了,嗯懶癌晚期必備
Franktian/GitAliasAuto · GitHub------------------------------------2015-01-30更新-------------------自問自答,拋磚引玉用git alias設置short cut可以大大提高每次輸入命令的效率。
舉個栗子:在GIt控制台里輸入git config --global alias.co checkout
以後每次輸入git co就相當於git checkout了
下面是一些自己常用的st = status
ci = commit
br = branch
co = checkout
df = diff
po = push origin
pl = pull origin
pu = pull upstream
官方文檔
11. Aliases | Git How To對於已經在版本控制之下的文件,修改後一般需要以下兩步操作提交代碼git add &
和
git commit -m "&
git commit -am "commit message"
一行命令進行stage和commit兩步操作,-a 代表目標為所有修改過的文件(注意不包括untracked files)
這個方法對於有很多修改過的文件並不推薦,原因在於Commit message原則要做到盡量細緻闡述當前修改的代碼的意義,太多文件可能包含多個不同的目的,所以大家要盡量勤快的committitle: Git常用命令和Git團隊使用規範指南
date: 2016-04-22 16:22:32categories: 學習 | Studydescription: Git是目前世界上最先進的分散式版本控制系統---## 前言
在2005年的某一天,Linux之父Linus Torvalds 發布了他的又一個里程碑作品——Git。它的出現改變了軟體開發流程,大大地提高了開發流暢度,直到現在仍十分流行,完全沒有衰退的跡象。其實一般情況下,只需要掌握git的幾個常用命令即可,但是在使用的過程中難免會遇到各種複雜的需求,這時候經常需要搜索,非常麻煩,故總結了一下自己平常會用到的git操作。本文根據團隊實踐記錄Git入門指南和Git常用命令,文章中不僅記錄了Git的搭建和使用教程,還參考了大量Git團隊使用規範上的經驗,希望大家可以結合自己團隊的實際應用場景讓Git協作優雅的落地。
&> Git是目前世界上最先進的分散式版本控制系統
## 更新記錄
2016年04月22日 - 初稿
閱讀原文 - Git常用命令和Git團隊使用規範指南
**擴展閱讀**
Git Book - Git - Book
git簡明指南 - git - the simple guide常用 Git 命令清單 - http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html猴子都能懂的GIT入門 - http://backlogtool.com/git-guide/cn/Git教程 - Git教程 - 廖雪峰的官方網站## SVN與Git的最主要的區別
SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網還可以,帶寬夠大,速度夠快,如果在互聯網下,如果網速慢的話,就納悶了。
Git是分散式版本控制系統,那麼它就沒有中央伺服器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
## Git搭建和使用
&> Git上手並不難,深入學習還是建議多實踐,可以參考擴展閱讀中廖雪峰的Git教程
### Git服務端
&> 服務端搭建Git很簡單,有更多需求不妨試試Gogs和Gitlab
使用Gogs輕鬆搭建可能比GitLab更好用的Git服務平台 - 使用Gogs輕鬆搭建可能比GitLab更好用的Git服務平台
``` bash
#安裝gitsudo apt-get install gityum install git#創建一個git用戶,用來運行git服務
sudo adduser git#創建證書使用公鑰免密碼登錄(可選)
ssh-keygen -t rsavi ~/.ssh/authorized_keys#初始化Git倉庫
sudo git init --bare sample.gitsudo chown -R git:git sample.git#禁用shell登錄
vi /etc/passwdgit:x:1001:1001:,,,:/home/git:/usr/bin/git-shell#在客戶端上克隆遠程倉庫
git clone git@server:/srv/sample.git```
管理公鑰推薦使用Gitosis
Gitosis - GitHub - res0nat0r/gitosis: Manage git repositories, provide access to them over SSH, with tight access control and not needing shell accounts.Gitosis配置手記 - Gitosis配置手記管理許可權推薦使用Gitolite
Gitolite - GitHub - sitaramc/gitolite: Hosting git repositories -- Gitolite allows you to setup git hosting on a central server, with very fine-grained access control and many (many!) more powerful features.### Git客戶端
&> Git客戶端可以按個人習慣來選擇,遵守團隊協作中的Git規範標準才是更重要的
Git - Git
TortoiseGit - TortoiseGit a€「 Windows Shell Interface to GitSourceTree - Free Mercurial and Git Client for Windows and Mac``` bash
#以最基本的Git命令行為例,先下載GitGit - Downloads#配置git提交用戶名和郵箱,定義別名方便區分
git config --global user.name "你的姓名"git config --global user.email "you@example.com"#克隆倉庫
git clone cap@172.28.70.243:/cap/cap.git$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into "cap"...warning: You appear to have cloned an empty repository.Checking connectivity... done.#測試推送
touch READMEgit add READMEgit commit -m "add readme"git push origin masterCounting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.Total 3 (delta 0), reused 0 (delta 0)To cap@172.28.70.243:/cap/cap.git* [new branch] master -&> master```
## Git常用命令
**符號約定**
- `&
``` bash
#初始設置git config --global user.name "&<用戶名&>" #設置用戶名git config --global user.email "&<電子郵件&>" #設置電子郵件#本地操作
git add [-i] #保存更新,-i為逐個確認。git status #檢查更新。git commit [-a] -m "&<更新說明&>" #提交更新,-a為包含內容修改和增刪,-m為說明信息,也可以使用 -am。#遠端操作
git clone &#分支相關
git branch [-r] [-a] #列出分支,-r遠端 ,-a全部git branch &<分支名&> #新建分支git branch -b &<分支名&> #新建並切換分支git branch -d &<分支名&> #刪除分支git checkout &<分支名&> #切換到分支git checkout -b &<本地branch&> [-t &<遠端別名&>/&<遠端分支&>] #-b新建本地分支並切換到分支, -t綁定遠端分支git merge &<分支名&> #合併某分支到當前分支```
Git常用命令 - Git常用命令
- workspace: 本地的工作目錄。(記作A)
- index:緩存區域,臨時保存本地改動。(記作B)- local repository: 本地倉庫,只想最後一次提交HEAD。(記作C)- remote repository:遠程倉庫。(記作D)&> 以下所有的命令的功能說明,都採用上述的標記的A、B、C、D的方式來闡述。
``` bash
#初始化git init //創建git clone /path/to/repository //檢出git config --global user.email "you@example.com" //配置emailgit config --global user.name "Name" //配置用戶名#操作
git add &git commit -m "代碼提交信息" //文件提交,B → C
git commit --amend //與上次commit合併, *B → Cgit push origin master //推送至master分支, C → D
git pull //更新本地倉庫至最新改動, D → Agit fetch //抓取遠程倉庫更新, D → Cgit log //查看提交記錄
git status //查看修改狀態git diff//查看詳細修改內容git show//顯示某次提交的內容#撤銷操作
git reset &git checkout // 從index複製到workspace, B → A
git checkout -- files // 文件從index複製到workspace, B → Agit checkout HEAD -- files // 文件從local repository複製到workspace, C → A#分支相關
git checkout -b branch_name //創建名叫「branch_name」的分支,並切換過去git checkout master //切換回主分支git branch -d branch_name // 刪除名叫「branch_name」的分支git push origin branch_name //推送分支到遠端倉庫git merge branch_name // 合併分支branch_name到當前分支(如master)git rebase //衍合,線性化的自動, D → A#衝突處理
git diff //對比workspace與indexgit diff HEAD //對於workspace與最後一次commitgit diff &#其他
gitk //開燈圖形化gitgit config color.ui true //彩色的 git 輸出git config format.pretty oneline //顯示歷史記錄時,每個提交的信息只顯示一行git add -i //互動式添加文件到暫存區```## Git使用規範
Git 使用規範流程 - http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
團隊中的 Git 實踐 - 團隊中的 Git 實踐構家網 git 團隊協作使用規範 v2 - 構家網 git 團隊協作范 使用規範 v2_百度文庫&> Git使用規範提醒
- 使用Git過程中,必須通過創建分支進行開發,堅決禁止在主幹分支上直接開發。review的同事有責任檢查其他同事是否遵循分支規範。- 在Git中,默認是不會提交空目錄的,如果想提交某個空目錄到版本庫中,需要在該目錄下新建一個 .gitignore 的空白文件,就可以提交了- 把外部文件納入到自己的 Git 分支來的時候一定要記得是先比對,確認所有修改都是自己修改的,然後再納入。不然,容易出現代碼回溯- 多人協作時,不要各自在自己的 Git 分支開發,然後發文件合併。正確的方法應該是開一個遠程分支,然後一起在遠程分支里協作。不然,容易出現代碼回溯(即別人的代碼被覆蓋的情況)- 每個人提交代碼是一定要 git diff 看提交的東西是不是都是自己修改的。如果有不是自己修改的內容,很可能就是代碼回溯- review 代碼的時候如果看到有被刪除掉的代碼,一定要確實是否是寫代碼的同事自己刪除的。如果不是,很可能就是代碼回溯git-auto-squash
git-auto-squash 可以將提交歷史中連續的fixup 合併到它之前最早的1個正式提交點上,類似不需要交互的rebase --interactive。
] &Usage:
&> git-auto-squash [-f] [-p &
舉個栗子
運行 git-auto-squash 後將所有 fixup! 開頭的message的commit 合併到最早遇到的非fixup!的提交點」ok」上.
處理merge的栗子git-auto-squash 也可以處理merge的fixup。對於merge commit,如果它的其中一個parent被squash掉了,它也會被squash掉:
這樣在某些merge commit有3個或3個以上的parent的時候,會丟棄某些中間的merge點。 但不影響最終結果。
處理merge的歷史的時候建議加上-t參數, 以保證被重寫的歷史裡所有的分支都會指向新的提交點。
主頁: 隨手改變世界之 git-auto-squash
下載git-auto-squash on gist
複製腳本到/usr/local/bin下並:
chmod +x git-auto-squash
在公司工作或者管理學習代碼,開發的代碼時使用Git是一個十分方便的選擇,然而,有些時候會遇到commit以後要規範化備註,以便以後出問題了回溯版本就可以看得到每次commit的詳情。
每次手動輸入一堆東西,又比較坑,這次BUG放前面,下次忘了又把說明放前面,導致查找的時候又有點混亂。
這個時候,定一個模板,輕鬆加愉快,規範化管理代碼,節約時間成本,又提高代碼效率,何樂而不為呢~
做法:
一、在工程的根目錄下建立模板文件
比如建立一個gitcommit_template 文件,裡面的內容為:
[部門][項目]:
問題原因:
解決方法:
變更類別:
適用機型:
驗證建議:
關聯變更項:
任務 Id:
二、設置模板的命令
- 設置當前分支的提交模板
git config commit.template [模板文件名]
例如:git config commit.template gitcommit_template
- 設置全局的提交模板
git config --global commit.template [模板文件名]
例如:git config --global commit.template gitcommit_template
- 設置文本編輯器
git config -global core.editor [編輯器名稱]
例如:git config -global core.editor vim
選擇你需要的相應設置然後你就可以提交你的文件了。
- 提交代碼
git commit (git gommit 之前需要將沒有加入代碼庫的 git add 進入代碼庫)
git commit -a (這個可以提交多個代碼文件)
此時,你commit之後,就會用你設置的編輯器打開你設置的模板,然後按照你的格式添加相應的備註,保存
- 提交到遠程分支
git push
git rebase -i 修改提交記錄git stash 當前分支放到緩存棧, 炒雞好用的兩個技能.
在文件路徑參數前加上--空格,可以避免歧義
是時候奉上我的git命令速記寶典了!
生成SSH Key
ssh-keygen -t rsa -C "youremail@example.com"
- 在用戶主目錄里找到.ssh目錄
- 將id_rsa.pub中的數據放到伺服器的.ssh目錄下
克隆遠程倉庫
git clone https/git
查看所有的版本提交記錄
git log (--pretty=oneline)
$ git log
commit affd8ca1bc90c0865fbdc425726513b1dd09a523
Author: chaimm &<350142639@qq.com&>
Date: Mon May 8 15:28:08 2017 +0800
自動化查詢頁增加:分頁功能
commit b8f06aab3a71bd4a4b66c5310b52be36748b56af
Merge: 1766243 3648640
Author: ZzzSimon &<2234587454@qq.com&>
Date: Mon May 8 15:20:17 2017 +0800
+分頁
查看版本回退/提交信息
git reflog
本地版本倉庫的版本回退
git reset --hard 3628164
工作區 與 暫存區 與 本地版本庫
- 對代碼的修改是在工作區進行的;
- git add後代碼會進入暫存區
- git commit僅會提交暫存區的代碼,不會提交工作區的代碼!
撤銷工作區修改
git checkout -- 指定文件
- 若暫存區是乾淨的,則工作區撤銷後,和之前提交的版本保持一致;
- 若暫存區已經有代碼了,則工作區撤銷後,和暫存區的代碼保持一致。
注意:git checkout 後必須加–,否則就成切換分支命令了!
撤銷暫存區的修改,將暫存區的修改放回至工作區
git reset HEAD 指定文件
創建分支
git branch 新分支名
切換分支
git checkout 指定分支名
查看所有分支
git branch
* dev
master
合併分支
- 切換到master分支上:
git checkout master
- 將指定分支合併至master分支
git merge dev
刪除指定分支
git branch -d 分支名
分支管理策略
- master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
- 幹活都在dev分支上,每個人都有自己的dev分支;
- 所以,團隊合作的分支看起來就像這樣:
Bug分支
當被分配到bug時,需要創建一個新分支,在上面進行修改。但此時可能還在自己的dev分支上開發新功能,此時需要將當前工作區存起來,在bug修復完後再還原。
- 存儲當前工作區
git stash
- 切回master分支,基於master分支創建新的bug分支
git checkout master
git checkout -b issue-101
- 在新分支上修改bug
- 切回master分支,合併bug分支
git checkout master
git merge issue-101
- 刪除bug分支
git branch -d issue-101
- 查看所有保存的工作區
git stash list
- 使用apply還原指定stash,再使用drop刪除
git stash apply xxx
git stash drop xxx
- 使用pop還原並刪除第一個stash
git stash pop
用branch管(yin)理(cang)FBI Warning
真實情況:卧槽這誰寫的這麼噁心?git reset HEAD~1git push -f( ̄ー ̄)
寫幾個我常用的。
git commit -am "blabla" 快速提交
git checkout - 切換回上一次分支git fetch —prune 和遠程分支同步git branch -r --merged | grep -v master | sed "s/origin///『 這個可以將你merge到master的分支刪除掉git rm --cached a.a 移除暫存區的文件(在分類提交時挺管用的git diff --cached 或 $ git diff --staged 查看尚未提交的更新+++++++另 付上一個速查表 大家共勉:git status 查看當前狀態git commit 提交
git branch -a 查看所有的分支
git branch -r 查看遠程所有分支
git commit -am "init" 提交並且加註釋
git remote add origin git@192.168.1.119:ndshow
git push origin master 將文件給推到伺服器上
git remote show origin 顯示遠程庫origin里的資源
git push origin master:develop
git push origin master:hb-dev 將本地庫與伺服器上的庫進行關聯
git checkout --track origin/dev 切換到遠程dev分支
git branch -D master develop 刪除本地庫develop
git checkout -b dev 建立一個新的本地分支dev
git merge origin/dev 將分支dev與當前分支進行合併
git checkout dev 切換到本地dev分支
git remote show 查看遠程庫
git add .
git rm 文件名(包括路徑) 從git中刪除指定文件
git clone git://http://github.com/schacon/grit.git 從伺服器上將代碼給拉下來
git config --list 看所有用戶
git ls-files 看已經被提交的
git rm [file name] 刪除一個文件
git commit -a 提交當前repos的所有的改變
git add [file name] 添加一個文件到git index
git commit -v 當你用-v參數的時候可以看commit的差異
git commit -m "This is the message describing the commit" 添加commit信息
git commit -a -a是代表add,把所有的change加到git index里然後再commit
git commit -a -v 一般提交命令
git log 看你commit的日誌
git diff 查看尚未暫存的更新
git rm a.a 移除文件(從暫存區和工作區中刪除)
git rm --cached a.a 移除文件(只從暫存區中刪除)
git commit -m "remove" 移除文件(從Git中刪除)
git rm -f a.a 強行移除修改後文件(從暫存區和工作區中刪除)
git diff --cached 或 $ git diff --staged 查看尚未提交的更新
git stash push 將文件給push到一個臨時空間中
git stash pop 將文件從臨時空間pop下來
---------------------------------------------------------
git remote add origin git@github.com:username/Hello-World.git
git push origin master 將本地項目給提交到伺服器中
-----------------------------------------------------------
git pull 本地與伺服器端同步
-----------------------------------------------------------------
git push (遠程倉庫名) (分支名) 將本地分支推送到伺服器上去。
git push origin serverfix:awesomebranch
------------------------------------------------------------------
git fetch 相當於是從遠程獲取最新版本到本地,不會自動merge
git commit -a -m "log_message" (-a是提交所有改動,-m是加入log信息) 本地修改同步至伺服器端 :
git branch branch_0.1 master 從主分支master創建branch_0.1分支
git branch -m branch_0.1 branch_1.0 將branch_0.1重命名為branch_1.0
git checkout branch_1.0/master 切換到branch_1.0/master分支
du -hs
pro git。書里寫得好清楚。感覺以上都不是奇技淫巧,和人說自己不懂這些,就以為這些是很高端的命令,其實只不過是我們都懶得好好讀文檔了。