git全局配置文件.gitconfig
默認在當前系統用戶文件夾下,window可運行%USERPROFILE%
查找,Mac系統在cd ~查找。linux
具體配置可參考以下,其中:git
【user】: 用戶提交時顯示在log裏的信息
【alias】: 經常使用git命令簡寫
【core】: window系統和類linux系統回車鍵轉換
【push】: 默認對應遠端(當本地分支名與遠程分支名不一致有用)
[user] name = hoby email = hoby@github.com [alias] st = status co = checkout br = branch ci = commit pl = pull --rebase ps = push mg = merge --no-ff lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit [core] autocrlf = input ignorecase = false [push] default = upstream
若要使用git mergetool
功能,再增長配置(cmd處可修改爲本地文件比較工具如beyond compare):github
[merge] tool = sourcetree [diff] tool = sourcetree [difftool "sourcetree"] cmd = 'C:/Program Files/TortoiseGit/bin/TortoiseGitMerge.exe' \"$LOCAL\" \"$REMOTE\" [mergetool "sourcetree"] cmd = 'C:/Program Files/TortoiseGit/bin/TortoiseGitMerge.exe' -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\" trustExitCode = true
若是不加--global 修改的是當前項目git配置。vim
$ git config --global --list # 查看全局配置 $ git config --global user.name hoby # 修改提交名 $ git config --global alias.br branch # 修改簡寫 $ git config --unset alias.co # 刪除配置項 $ git config --global core.ignorecase false # 關閉忽略大小寫
若是想快速簡單的clone一個git項目,在拉取時直接帶上用戶名+密碼,此方法在服務器自動化構建時常常用到,具體實現以下:windows
$ git clone http(s)://username:passwd@githbub.com/hoby/xxx.git
需注意的是:此處username通常爲用戶名非整個郵箱地址,好比hoby@qq.com的用戶,只須要用hoby便可,若必定須要完整郵箱地址可將郵箱中的@符號使用%40替換
1.)檢查SSH Key存在
若是存在id_rsa.pub 或 id_dsa.pub 文件,跳過此步。緩存
$ cd ~/.ssh # 查看用戶根目錄下.ssh文件夾 $ ls
建立ssh key時會提示自定名稱和push時的密碼(不是git登陸密碼),通常推薦略過,直接三個回車,若是建立成功會出來一個有圖案的小框框。bash
# 此email可任意,不必定要gitLab登陸郵箱 $ ssh-keygen -t rsa -C "your_email@example.com"
3.)查看SSH Key
copy公鑰內容到gitLab裏,添加進去。服務器
$ cat ~/.ssh/id_rsa.pub
4.)測試SSH Keyapp
$ ssh -T "git@xxx.xxx.com"
5.)配置多個網站ssh密鑰
在生成每一個網站ssh-key時,自定義名稱不要同樣,而後在~/.ssh目錄下新建一個config文件,而後配置多個網站的ssh信息,內容以下:ssh
# gitLab Host dev.gitLab.com HostName dev.gitLab.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa # phabricator Host 192.168.1.5 HostName 192.168.1.5 Port 22 PreferredAuthentications publickey IdentityFile ~/.ssh/phabricator
http(s)建立的項目,操做時老是提示用戶名和密碼,不勝其煩,如下方案可讓Git永遠記住用戶名與密碼:
1.)添加HOME變量
在Windows用戶變量中添加一個HOME環境變量,值爲%USERPROFILE%
,以下圖:
2.)建立_netrc文件
在"開始>運行"中打開%Home%
,新建一個名爲_netrc
的文件,輸入Git服務器名、用戶名、密碼保存,可放多個不一樣登陸信息的Git項目,中間空一行便可,具體內容以下:
machine dev.github.com login hoby password 123456
有時你在winodws/Mac下以http(s)方式clone項目時會發現,第一次輸入的用戶名和密碼會被系統記住,後面不用再輸入。這些是git經過credential helper(憑證小助手)幫你實現的, helper的類型有不少,具體可經過以下命令查看當前你的類型:
$ git config --list | grep credential
a.) Mac系統:
git默認提供osxkeychain輔助程序來管理你的密碼,具體能夠經過Mac系統菜單頁面「其餘->鑰匙串訪問」功能查看b.) Windows下憑證存儲類型有四種:
git-credential-winstore、git-credential-manager(若是安裝了Git GUI),git-credential-store(在.gitconfig配置store路徑)和git-credential-cache(緩存在內存),例如,若Windows安裝Git GUI後,經過上面的命令查看,默認會輸出:
credential.helper=manager
windows下git憑證存儲位置:控制面板->用戶帳戶->管理windows憑據,可去查看或修改
初始化後,目錄下會生成.git
隱藏文件夾,圖標顯示git可控,.git
目錄下有一個hooks,裏面能夠對預提交信息作一些規範和限制。
$ git init
a.) 添加關聯地址:
$ git remote add origin http://dev.github.com:9800/root/front.git
b.) 修改關聯地址:
$ git remote set-url origin http://dev.github.com:9800/root/front.git
c.) 添加多個遠程倉庫:
能夠添加兩個遠程倉庫,同時push
$ git remote set-url --add origin http://dev.github.com:9800/root/front.git
d.) 切換http(s)/ssh方式:
$ git remote rm origin $ git remote add origin "git遠程地址" $ git push origin
$ git remote -v
$ git clone http://dev.github.com:9800/root/front.git
會在當前目錄下自動生成front的倉庫目錄,若是自定義文件夾名,後面空格後加上名稱
$ git br # 查看本地 $ git br -r # 查看遠端 $ git br -a # 查看全部
可全面查看本地分支狀態,遠端對應關係,落後/優先多少,最後一次提交信息及hash值
$ git br -vv
a.) 建立本地分支:
本地分支名可不與遠程一致,簡單一點,方便Tab鍵補全,只要.gitconfig
裏的[push]
項設置default = upstream
便可,否則提交時,會提示本地與遠程不一致
$ git br <branch> <origin-branch> # 建立分支,並關聯遠端 # 或: $ git co -b <branch> <origin-branch> # 建立分支並當即切換過去
b.) 建立遠程分支:(本地分支推送到遠端)
$ git push origin -u <branch>:<origin-branch> # -u:建立遠程分支並關聯,origin-branch不用帶origin/路徑
$ git co <branch> # 切換到遊離分支(不在任何分支) $ git fetch $ git co FETCH_HEAD
a.) 合併本地分支:
$ git merge <branch> --no-ff # --no-ff:關閉Fast-Foward合併,這樣能夠生成merge提交,保留分支合併信息
會出來vim編輯窗口(可修改提交信息),不修改則按shift + : 再輸入wq(保存退出)後回車便可。
b.) 合併遠端本地(不用先checkout到本地):
$ git fetch # 先更新遠程倉庫全部分支上最新commit-id到本地 $ git merge origin/<branch> --no-ff # 再從遠端merge,無需先拉取到本地
c.) 取消合併:
$ git merge --abort
d.) 合併衝突處理:
$ git mergetool # 若是在~/.gitconfig下正確配置了比較工具,會依次彈出比較窗口,處理後保存 $ git clean -nfd # 查看不在版本庫中合併文件,以.org結尾 $ git clean -fd # 確認無誤後,移除這個.org臨時文件 $ git add -A $ git merge --continue # 繼續完成merge流程
a.) 修改分支名稱:
$ git br -m <branchName>
b.) 修改當前分支遠端關聯:
$ git br --set-upstream-to <origin-branch>
c.) 修改指定分支遠端關聯:
$ git br --set-upstream <branch> <origin-branch>
a.) 刪除本地分支:
$ git br -d <branch>
b.) 強制刪除本地分支:
$ git br -D <branch> # 未被合併的分支被刪除的時候須要強制
c.) 刪除遠端分支:
$ git push origin --delete <branch> # 或: $ git push origin :<branch> # 推送一個空分支到遠端,即刪除
從遠端拉取最新的分支信息,更新本地緩存
$ git fetch -p # 更新被刪除的分支
$ git st # 查看當前工做狀態
a.) 查看所有提交記錄:
$ git lg
b.) 查看單個文件全部記錄:
$ git lg <fileName>
c.) 查看單個文件修改詳情:
$ git lg -p <fileName> # 可查看比較文件歷史修改記錄
d.) 查看單條記錄詳情:
$ git show <commit-id> # 日誌的hash值
e.) 查找全部包括指定字符串文件:
$ git grep -n <string> # -n:顯示字符串所在的行數
a.) 查看比較文件:(與暫存區比較)
若是當前文件沒被修改,須要查看歷史修改狀況,用上面的git lg -p fileName
$ git diff <fileName> # 比較當前文件和暫存區文件差別,應用在提交前確認的場景
b.) 比較兩次提交記錄:
$ git diff <commit-id1> <commit-id2> # 比較兩次提交之間的差別
每一次當前HEAD發生改變(包括切換branch, pull, 添加新commit)一個新的紀錄就會被添加到reflog
$ git reflog
a.) 非快進更新:
$ git pull --no-ff
b.) 基於rebase:
這個命令會迫使git將遠程分支上的變動同步到本地,而後將還沒有推送的提交從新應用到這個最新版本,就好象它們剛剛發生同樣,這樣就能夠避免合併以及隨之而來的醜陋的合併信息
$ git pull --rebase # 避免產生無用的合併信息
例:當前狀態爲 * master c7bcf10 [origin/master: ahead 1, behind 1] * [cps-bk] add a.js
此時用--rebase只產生1 commit,而普通的git pull會產生2 commits,其中一條是不必的合併信息。
若--rebase衝突了,解決方案:
$ git add -A # 強制添加到 $ git rebase --continue $ git push
c.) 臨時更新:(暫存)
$ git stash # 先放入暫存區 $ git pull $ git stash pop # 恢復顯示工做內容,或用git stash apply stash@{n}挑選恢復哪一個
d.) 管理暫存:
$ git stash list # 顯示暫存列表 $ git stash clear # 清除暫存列表
a.) 多個修改,只提交部分:
$ git add <file1> <file2> # 只添加要提交的到本地暫存區 $ git ci -m 'commit info' # -m處不加a $ git push
b.) 提交所有:
$ git add . # 有新文件時,必定要 $ git ci -am 'commit info' $ git push
c.) 追加提交:(未push到遠端)
將最近一次的變動追加到最新的提交,同時也能夠編輯提交信息,不產生新的提交記錄。
$ git ci --amend # 若是已push到遠端,不建議追加,容易跟本身衝突 $ git push
d.) 提交時繞過pre-commit驗證:
$ git ci -am 'commit info' --no-verify
從別的分支同步一個commit到本分支
$ git cherry-pick <commit-id> # 提取一個merge提交 $ git cherry-pick -m <parent-number> <commit-id> # parent-number爲主線序號,通常是第一個,也便是1
tag用來標記一個版本,用於往後的恢復
# 查看全部tag $ git tag # 新增 $ git tag v1.0.0 # 刪除 $ git tag -d v1.0.0 # 刪除本地 $ git push origin :refs/tags/v1.0.0 # 刪除遠程 # 推送 $ git push --tags
a.) 已修改,未暫存:
# 恢復單個文件或目錄 $ git co <fileName|directory> # 恢復所有 $ git co .
b.) 已暫存,未提交:
$ git reset HEAD^ # 向前回滾一條記錄,至關於HEAD~1 $ git co .
c.) 恢復前N條:
$ git reset HEAD~n # 默認省略--soft參數,屬於軟恢復,n>=1整數
d.) 硬恢復:
$ git reset --hard HEAD~n|<commit-id> # 不保留當前修改,要小心,確認當前修改沒有用了
a.) 單次回滾: git revert
會產生一個新的與以前commit相反的操做,來抵消以前錯誤的提交。
1.) 回滾一個普通commit
$ git revert <commit-id> # 也能夠屢次操做,達到恢復多個的目的 $ git push
2.) 回滾一個merge
$ git show <merge-id> # 查看merge的commit-id,有一行顯示:Merge: 96db08bb0 3669a27a5 # 覈對一下以哪一個爲主線(主線的內容將會保留,而另外一條分支的內容將被revert),若第一個爲準,parent-number就是1 $ git revert -m <parent-number> <merge-id> $ git push
值的注意的是:若是剛纔revert掉的內容,後面若是要再合併過來,須要在以前執行revert所在的分支上再執行一次revert,不然會形成那次的內容丟失(git記憶功能):
git revert <revert-commit-id>
b.) 指定位置:
$ git reset --hard <commit-id> # 恢復到當前位置 $ git push -f # 要加-f強制推送
c.) 挑選模式:
$ git rebase -i <commit-id> # 會打開編輯,剔除挑選記錄 $ git push -f # 要加-f強制推送
a.) 忽略跟蹤:
.gitignore只能忽略那些原來沒有被跟蹤的文件,若是文件已被歸入版本管理中,則修改.gitignore是無效的。
$ git update-index --assume-unchanged <file>
b.) 恢復跟蹤:
$ git update-index --no-assume-unchanged <file>
c.) 查看被忽略的跟蹤:
$ git ls-files -v|grep '^h'
d.) 另外一個相似的功能:
# 忽略 $ git update-index --skip-worktree <file> # 恢復 $ git update-index --no-skip-worktree <file>
a.) 移除版本控制:
$ git rm <file> --cached # -r:移除目錄, --cached:保留本地的文件
b.) 清理工做樹:
$ git clean -fd # 移除未跟蹤的文件和目錄,若是加上-n參數來先看看會刪掉哪些文件
c.) gitLab拉取代碼:
$ git clean -df && git reset --hard && git pull
d.) 垃圾回收:
Git 往磁盤保存對象時默認使用的格式叫鬆散對象(loose object)格式,當手動執行git gc 命令,或推送至遠程服務器時,Git會將這些對象打包至一個叫packfile的二進制文件以節省空間並提升效率。
$ git gc --auto $ git repack -d -l
$ git help
或查看某一條指令參數:
git <command> -n
linux服務器clone時報0644權限過大提示:
WARNING: UNPROTECTED PRIVATE KEY FILE!
# 修改權限 $ chmod 0600 id_rsa*