Git對向後兼容性有着強烈的承諾:許多功能強大的特性隱藏在選項背後,而不是做爲默認行爲公開。幸運的是,Git也支持別名,所以您能夠建立本身的命令來執行各類各樣的Git魔法。如下是在個人.gitconfig中定義的一些更有用(或至少是有趣的)別名的選擇:git
$ git config --global alias.please 'push --force-with-lease'
每一個開發人員都與他們的團隊負責人進行了交流,討論了強制推動共享分支的問題(也就是說,不要這麼作)。Rebase、amend和squash。直到你重寫了一些共享的歷史,並在你的存儲庫中溢出了重複的提交,這些都是很是有趣的事情。幸運的是,Git不會讓您隨意重寫服務器上的歷史。您必須顯式地將--force選項傳遞給git push,以顯示您的業務。可是強制推動有點笨拙:它會用你的本地版本在上游分支上踩下,而你尚未得到的任何改變都將從歷史中抹去。json
Git的 --force-with-lease 選項會更優雅:它會檢查您的本地副本是否在重寫以前是最新的。這代表您至少已經獲取了您將要進行的更改。因爲 git push --force-with-lease 每次都要輸入不少東西,因此我已經爲它建立了一個優雅的別名:git pleasebash
$ git config --global alias.commend 'commit --amend --no-edit'
每次 commit,而後當即意識到你已經忘記了要stage一個文件?無需煩惱!git commend 靜默的將提交的文件附加在你的上次commit上,複用上次的commit內容。服務器
$ git add Dockerfile $ git commit -m ‘Update Bitbucket pipeline with new Docker image’ # (facepalm) $ git add bitbucket-pipelines.yml $ git commend
$ git config --global alias.it \ '!git init && git commit -m 「root」 --allow-empty'
存儲庫的第一個提交不能像常規提交同樣從新構建,所以建立一個空提交做爲存儲庫根是很好的實踐。git it 即初始化您的存儲庫,並在一個快速步驟中建立一個空的根提交。下一次,當你啓動一個項目時,不要只是將它添加到版本控制中:git it 吧!spa
$ cd shiny-new-thing $ git it Initialized empty Git repository in /shiny-new-thing/.git/ [master (root-commit) efc9119] root
$ git config --global alias.stsh 'stash --keep-index' $ git config --global alias.staash 'stash --include-untracked' $ git config --global alias.staaash 'stash --all'
git stash 是最使人愉快和有用的git命令之一。在您的工做樹中跟蹤文件的任何更改,並將它們清除,以便之後使用,留下一個乾淨的工做樹。可是,若是您已經建立了任何新文件,而且尚未設置它們,那麼 git stash 將不會在默認狀況下對它們進行操做,這將給您留下一個髒的工做樹。相似地,未被跟蹤或忽略的文件的內容在缺省狀況下不會被隱藏。版本控制
我已經建立了一些方便的別名來處理不一樣的git stash,基於您須要存儲的工做樹的哪些部分:code
git stsh # 只保存對跟蹤文件的未保存更改 git stash # 保存對跟蹤文件的任何更改 git staash # 保存未跟蹤文件並跟蹤 git staaash # 保存忽略的,未跟蹤的和跟蹤的文件
若是有疑問,長期的(git staaash)將會使您的工做樹恢復到看起來像您的存儲庫的新克隆。orm
$ git config --global alias.shorty 'status --short --branch'
我運行 git status 可能比任何其餘git命令都要多。多年來,Git的內聯幫助變得更加友好,這對於初學者來講是很是好的,可是對於那些熟悉Git的人來講,輸出的內容過於冗長。例如,git status 給出了18行代碼,告訴我有一些分段的、未分段的和未跟蹤的更改:ip
$ git status On branch master Changes to be committed: (use 「git reset HEAD <file>…」 to unstage) modified: package.json Changes not staged for commit: (use 「git add <file>…」 to update what will be committed) (use 「git checkout -- <file>…」 to discard changes) modified: package.json Untracked files: (use 「git add <file>…」 to include in what will be committed) index.js
git shorty只須要三行,就能夠告訴我一樣的事情:開發
$ git shorty ## master AM test ?? .gitignore
(好吧,爲了簡潔起見,我實際上把這個別名做爲git st)
$ git config --global alias.merc 'merge --no-ff'
若是您使用的是標準的non-rebasing分支工做流,那麼運行一個標準的 git merge 來將功能分支與主分支結合起來實際上並不理想。沒有選項,git merge使用 --ff 合併策略,若是主分支沒有新的更改,它只會建立一個合併提交,不然它只是簡單地「快速轉發」您的主分支,以指向您的特性分支上的最新提交。只有在建立合併提交時,纔會考慮在查看git歷史時哪些代碼是在哪一個分支上開發的。
Git merc 使用 --no-ff 策略,老是建立一個合併提交。
順便說一句,當在Bitbucket中合併拉取請求時,咱們使用的是 --no-ff (默認狀況下)。
$ git config --global alias.grog 'log --graph --abbrev-commit --decorate --all --format=format:"%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(dim white) - %an%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n %C(white)%s%C(reset)"'
個人git grog (或「graphicallog」)的別名已經通過了多年的演變,以致於我再也不肯定我是否準確地理解了它所作的事情。但它看起來確實很漂亮:
下面是標準的 git log 比較:
commit 352ee71473c173283836f8d375be0b2c8a1579f5 Merge: 3171837 c86f21b Author: demo <demo@example.com> Date: Fri Oct 20 16:00:19 2017 +0800 Merge branch 'dev' ... * 352ee71 - Fri, 20 Oct 2017 16:00:19 +0800 - user1 (3 days) (HEAD -> master, origin/master, origin/dev, origin/HEAD, dev) |\ Merge branch 'dev' | * c86f21b - Fri, 20 Oct 2017 15:12:50 +0800 - user1 (3 days) | |\ Merge branch 'master' into dev | * | cfa8980 - Mon, 16 Oct 2017 15:05:38 +0800 - user1 (7 days) | | | modify memo * | | 3171837 - Fri, 20 Oct 2017 15:59:42 +0800 - user1 (3 days) | |/ modify user |/| ...
這裏有各類各樣的漂亮格式,因此請使用上面的命令,並將它變成您本身的!