標籤:

Git 有什麼奇技淫巧?

本人總結的git常用命令及操作,原文請點擊訪問GerritGit使用指南

git 進階操作切換協議

如果clone時,使用的是https,則每次提交都需要輸入用戶名與密碼,推薦使用ssh協議,可以使用以下命令將https轉為ssh協議

git remote set-url origin git@github.com:someaccount/someproject.git

導入倉庫

git init
git remote add origin git@github.com:Jamling/test.git
git push -u origin master

提交代碼到多個分支

如果代碼需要提交到多個分支,需要使用git cherry-pick功能。以下是一個示例

PS:master為主幹分支,dev為開發版本分支。

假設,我們當前在主幹分支master,則:

1,master分支上git add , git commit,並且記錄下commit id

2,git pull –rebase origin master // 確保master分支是最新狀態

3,git push origin master

4,git checkout dev切換到dev分支

5,git cherry-pick 後面加上master分支下的剛剛提交的commit id

6,git pull –rebase origin dev // 確保dev分支是最新的

7,git push origin dev


追加修改

當push代碼之後,review不通過或者想繼續修改,可以繼續編輯源代碼,然後再通過git commit –amend來追加修改

$ git add test.txt
$ git commit –m 「add test」
$ git push origin master
$ git add test2.txt
$ git commit --amend
$ git push origin master

版本回退

git reset可以實現版本回退

git reset --soft HEAD~

添加–soft選項,則本地修改仍然存在,commit信息將回退

HEAD~:表示將HEAD版本向前退一個版本~~表示兩個版本,亦可以用HEAD~2表示


提交tag

git tag -am 「commit message」 tagname
git push origin tagname:refs/heads/tagname
git push --tags

再補一份基本操作

基本操作

查看狀態

$ git status

查看狀態比如,已經加入git管控的文件(綠色),修改的文件(紅色),衝突的文件(both modified 紅色),新添加的文件(紅色)


添加文件

$ git status add

添加文件,可以添加目錄,文件,也可以使用git add .添加所有文件

建議在git add 之前先git status一下


提交代碼

$ git commit –m 「[add|mod|del|…]

提交日誌內容,盡量精準描述本次提交

如果忘了帶-m參數,可以進入vim/vi界面,按i進入編輯界面,然後輸入commit信息,再按esc退出編輯,輸入:wq(vim指令, vi指令自行百度)保存並退出


推送代碼

$ git push origin master

將當前代碼push到遠程master分支

如果沒有設置默認push,則需使用完整命令

$ git push origin HEAD:refs/for/master

拉取代碼

$ git pull --rebase origin master

從遠程分支master上拉取代碼,如果本地有修改,會導致拉取失敗,需要先暫存本地修改的代碼

此命令相當於svn的svn update

–rebase的作用是精簡commit信息,減少不必要的merge


暫存代碼

$ git stash

將本地修改的代碼暫存起來

可以添加-u參數,將添加的文件一併加入暫存區


從暫存區恢復

$ git stash apply

將暫時區的代碼恢復到當前分支,後面可以跟stash{position},將第position次的暫存恢復。

$ git stash pop

同git stash apply,並且從stash中刪除

$ git stash list

列出暫時區列表


有沒有覺得用cat來整理git ignore很麻煩呢。如果在github上創建project,會為你提供gitignore的template。所以就寫了一個小的git插件來管理gitignore,模版當然是來自github官方的ignore模版庫。

Git-Ignore,https://github.com/imwithye/git-ignore。

以後只要git ignore add java python c就可以添加java,python,c的ignore模版啦。


git的快捷鍵 alias,加 oh-my-zsh應該是使用中比較實用的小技巧

在實際應用中,一遍一遍輸入git status,git status,git commit -m "xx"什麼的確實挺繁瑣,於是配置alias可以簡化成 gst === git status,gcmsg "xxx" === git commit -m "xxx",gp === git push等等。。

大概是這樣配置的

  • alias gst="git status"
  • alias gp="git push"
  • alias gp="git push"
  • ...

而且還發現oh-my-zsh默認用的插件是git,查看oh-my-zsh的config

cat ~/.zshrc

其中有一條配置是

plugins=(git)

那麼刨根問底攔不住,看看git插件的配置

cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh

發現是一堆alias

alias g="git"

alias ga="git add"
alias gaa="git add --all"
alias gapa="git add --patch"

alias gb="git branch"
alias gba="git branch -a"
alias gbda="git branch --merged | command grep -vE "^(*|s*masters*$)" | command xargs -n 1 git branch -d"
alias gbl="git blame -b -w"
alias gbnm="git branch --no-merged"
alias gbr="git branch --remote"
alias gbs="git bisect"
alias gbsb="git bisect bad"
alias gbsg="git bisect good"
alias gbsr="git bisect reset"
alias gbss="git bisect start"

既然oh-my-zsh已經配置好了。。。那我們就可以直接使用了。。。

ga . gcmsg "update" gp

比較下之前的用法

git add . git commit -m "update" git push

簡直爽的一bi啊~~~


這個算么


git help


Git 把系統中的文件映射成 object,文件夾映射成 tree。Git 的這種設計方式使得它可以被當成一個文件系統的 Key-value store,.git 文件夾里的內容是它的資料庫。

一個場景是這樣的:你需要一個文件夾或者文件的簽名 (Key),並且在需要的時候可以用簽名找回原來的文件夾或文件(Value)。你不希望這些文件用不同的命名散布在文件系統里,但也不需要用到 git 版本歷史、branch、tag 等功能。

為此我寫了一個 Git 底層命令的 wrapper 來實現這種用例。(demon386/git-store · GitHub)


https://github.com/tiimgreen/github-cheat-sheet


Git 就別其奇淫技巧了,本來就能玩死一批人,就別教人學壞了。


git rebase --onto base from to

可以實現某個分支上(from,to](左開右閉)區間上的所有提交放到base上。

敲好用!!


git checkout xx-dev ~/dir/xx.java 誰用誰知道


1,head指向的是當前分支的最後一次提交(commit)的位置,執行git reflog後列表中出現的各種操作實際上是改變head位置的操作(commit/checkout/merge/reset等等),或者說所有改變head位置的操作都會有記錄。

2,commit不再是影響他人的提交,它只改變你本地的文件,所以無論多少次commit都是本地保存,相當於以前你用過的老辦法即標註日期在文件名上暫存你的某一次工作記錄

3,SVN中新創建一個branch的同時物理文件也確確實實的增加一份新的copy,但git只是增加一份記錄,物理文件(你看得到的)不會倍增


Git alias - git別名命令,使你的git操作炸裂

GIT顏文字COMMIT(CLI命令行模式) - 為你的commit內容美顏


Git說到底還是一個工具。各種不常用的命令實現的複雜功能都有辦法用簡單常用命令代替。工具還是那個原則:夠用就好,沒有必要追求炫目


先寫兩個。

1.

GIT鼓勵經常commit,所以少不了rebase,可是風險大,這時可以先備份一下:

git checkout -b current.bak

再切回來

git checkout -

2.

git log --stat

可同時看改動的文件


你有沒有想過如何在這個圈子裡面與其他Git開發人員一爭高下呢?當談到Git知識和經驗時,你是否覺得自己只是處於一個平均的水準?我們對開發人員進行了一項調查,以找到這些問題的答案,並發現Git還有哪些其它的趨勢!

1. 三分之二的開發人員認為自己是中級Git用戶。

而另外21%的人認為自己是初學者,13%的人認為自己是新手。

2. 三分之二的開發人員使用CLI和Git GUI的組合。

有22%的開發者只使用GUI,11%的只使用CLI。咳,咳,如果你不想只使用CLI的話,那麼GitKraken是一個很棒的Git GUI工具。

3. 超過三分之一的開發人員在http://GitHub.com上託管Git項目。

緊隨其後的是http://Bitbucket.com和http://GitLab.com,分別為24%和11%。你知道嗎,前三名都整合了GitKraken。

4.五分之二的開發人員在Windows上使用Git。

36%的人在Linux上使用Git進行開發,而在Mac上的使用比例為23%。

5. 有一半的Linux開發者使用Ubuntu作為他們的發行版。

緊隨其後的是Debian和CentOS,分別為15%和9%。選擇Ubuntu吧!

6. 六分之一的開發人員使用Visual Studio Code作為文本編輯器。

而Visual Studio、IntelliJ、Atom和Sublime這些文本編輯器的佔用比例都是~15%左右。這些編輯器真是平分秋色!

7. Sub-what?超過五分之二的開發人員從不使用git的Submodule。

28%的人很少使用Submodule,19%偶爾使用,6%經常使用,3%總是使用。

8.Git-where?幾乎五分之二的開發人員從不使用Gitflow。

18%的人很少使用Gitflow,17%的人有時使用,15%的人用的比較多,12%的人一直在使用Gitflow。

9. Git-who?超過五分之二的開發人員從不使用Git鉤子。

27%很少使用Git鉤子,18%有時使用,9%頻繁使用,4%一直在使用Git鉤子。


git rebase -i ,簡直神操作,

不僅可以rebase 別人的分支,還可以壓縮提交,修改自己分支的提交歷史

更多技巧參考我的博客:

使用Git管理項目 使用總結


有次我寫了一天的前端和後端代碼,commit了好多次,最後想把前後端的代碼區分,前端一個commit,後端一個commit,怎麼做的呢?

用的squash命令,假定我現在分支是A。

git checkout master切回主分支

git checkout -b A2

git merge --squash A

git reset

此刻所有的文件更改都未提交,自己按照前後端文件區別提交就可以


Git 配置最佳實踐 - SDK.CN - 中國領先的開發者服務平台


我來回答幾個不一樣的吧

1.編輯當前git的config文件

git config -e

相當於是

vi .git/config

2.在當前目錄創建一個本地git源

git init --bare ./

3.git協議說明,git其實支持的協議非常多有SSH、GIT、HTTP、HTTPS、FTP、FTPS、RSYNC及本地協議,建議通常使用ssh協議,如果我們在本地環境想搭建git工程,推薦git的本地協議

語法如下:

git clone file:///path/to/

或者

git clone /path/to/

用git的本地協議獲取本地代碼


大家有沒有遇到這種情況:代碼提交到代碼倉庫,發布上線之後,出現語法錯誤fatal error。有沒有辦法避免這種低於錯誤呢?

推薦一個git hook: git commit之前,自動檢查php語法:

GitHub - ReekenX/phpcheck-git: Tool to check your PHP files from parse errors before commit.

ps:示例:


全局的 gitignore 和 gitconfig

在家目錄下創建 .gitconfig 文件,

[user]
name = 你的名字
email = 你的郵箱
[core]
editor = vim ;或其他編輯器
excludesfile = 你的全局 ignore 文件地址(絕對地址):.gitignore_global
[merge]
tool = 你的 merge 工具,默認的是 vimdiff
[alias]
ci = commit -a -v
co = checkout
st = status
br = branch
lg = log --graph --pretty=mt:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&<%an&>%Creset" --abbrev-commit --
throw = reset --hard HEAD
[color]
ui = true

配置好後,你就可以使用git ci, git co, git st等命令了。

在家目錄下創建 .gitignore_global,這個文件中放的是全局的 git ignore 文件,比如編輯器的配置文件,緩存文件,編譯的文件等,下為例子

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
*.pyc

# Packages #
############
# it"s better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# VIM swp files #
#####################
*.swp
# sublime project files #
#####################
*.sublime-project

在項目下的 .gitignore 文件應該放和項目緊密相關的 ignore 文件,比如項目的配置,資料庫的配置等


大部分使用git的人都知道怎麼讓git忽略掉某個或者某些文件(使用.gitignore,如果還不知道趕緊去Google補個課吧),但是你知道如何用git忽略掉文件中某一/幾行內容嗎?

其實是利用git的filter,詳情請看: 如何讓Git忽略掉文件中的單/多行內容


git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk "{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s
",add,subs,loc }" -

git log --pretty="%aN" | sort | uniq -c | sort -k1 -n -r

這2個算嗎


不知道[這個](topwood (lijie) · GitHub)算不算。。


我經常做的事情:

git stash -p
# 然後開始修改文件,pull,merge,調戲妹子……
# 然後:
git stash pop


推薦閱讀:

QQ 有哪些鮮為人知的使用技巧?
非常非常怕水,但又非常非常想學會游泳,該如何克服?
Catia 有什麼奇技淫巧?
玩「誰是卧底」的時候有什麼技巧?
在 OS X 中如何設置隱藏文件夾?

TAG:Git | X使用技巧 |

分頁阅读: 1 2