Git常規配置與用法

Git環境配置

1、 全局配置

1. 配置文件

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

2. 命令修改

若是不加--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 # 關閉忽略大小寫

2、 Git密鑰配置

1. 單項目自動化clone

若是想快速簡單的clone一個git項目,在拉取時直接帶上用戶名+密碼,此方法在服務器自動化構建時常常用到,具體實現以下:windows

$ git clone http(s)://username:passwd@githbub.com/hoby/xxx.git
需注意的是:此處username通常爲用戶名非整個郵箱地址,好比hoby@qq.com的用戶,只須要用hoby便可,若必定須要完整郵箱地址可將郵箱中的@符號使用%40替換

2. 以SSH方式全局配置密鑰

1.)檢查SSH Key存在
若是存在id_rsa.pub 或 id_dsa.pub 文件,跳過此步。緩存

$ cd ~/.ssh # 查看用戶根目錄下.ssh文件夾
$ ls
2.)建立SSH Key

建立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

3. HTTP(S)方式全局配置密碼

http(s)建立的項目,操做時老是提示用戶名和密碼,不勝其煩,如下方案可讓Git永遠記住用戶名與密碼:

1.)添加HOME變量

在Windows用戶變量中添加一個HOME環境變量,值爲%USERPROFILE%,以下圖:
img

2.)建立_netrc文件

在"開始>運行"中打開%Home%,新建一個名爲_netrc的文件,輸入Git服務器名、用戶名、密碼保存,可放多個不一樣登陸信息的Git項目,中間空一行便可,具體內容以下:

machine dev.github.com
login hoby
password 123456

4. HTTP(S)方式的Git憑證存儲

有時你在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經常使用命令

1、倉庫管理

1. 初始化

初始化後,目錄下會生成.git隱藏文件夾,圖標顯示git可控,.git目錄下有一個hooks,裏面能夠對預提交信息作一些規範和限制。

$ git init

2. 添加/修改倉庫地址

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

3. 查看當前倉庫地址

$ git remote -v

4. 建立本地倉庫

$ git clone http://dev.github.com:9800/root/front.git

會在當前目錄下自動生成front的倉庫目錄,若是自定義文件夾名,後面空格後加上名稱

2、分支管理

1. 查看分支

$ git br    # 查看本地

$ git br -r # 查看遠端

$ git br -a # 查看全部

2. 查看分支狀態(推薦)

可全面查看本地分支狀態,遠端對應關係,落後/優先多少,最後一次提交信息及hash值

$ git br -vv

3. 建立分支

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/路徑

4. 切換分支

$ git co <branch>

# 切換到遊離分支(不在任何分支)
$ git fetch
$ git co FETCH_HEAD

5. 合併分支

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流程

6. 修改分支

a.) 修改分支名稱:

$ git br -m <branchName>

b.) 修改當前分支遠端關聯:

$ git br --set-upstream-to <origin-branch>

c.) 修改指定分支遠端關聯:

$ git br --set-upstream <branch> <origin-branch>

7. 刪除分支

a.) 刪除本地分支:

$ git br -d <branch>

b.) 強制刪除本地分支:

$ git br -D <branch>  # 未被合併的分支被刪除的時候須要強制

c.) 刪除遠端分支:

$ git push origin --delete <branch>
# 或:
$ git push origin :<branch>  # 推送一個空分支到遠端,即刪除

8. 更新分支

從遠端拉取最新的分支信息,更新本地緩存

$ git fetch -p   # 更新被刪除的分支

3、查看管理

1. 查看當前狀態

$ git st  # 查看當前工做狀態

2. 查看提交記錄

a.) 查看所有提交記錄:

$ git lg

b.) 查看單個文件全部記錄:

$ git lg <fileName>

c.) 查看單個文件修改詳情:

$ git lg -p <fileName>  # 可查看比較文件歷史修改記錄

d.) 查看單條記錄詳情:

$ git show <commit-id>  # 日誌的hash值

e.) 查找全部包括指定字符串文件:

$ git grep -n <string>  # -n:顯示字符串所在的行數

3. 查看比較文件

a.) 查看比較文件:(與暫存區比較)

若是當前文件沒被修改,須要查看歷史修改狀況,用上面的git lg -p fileName

$ git diff <fileName>  # 比較當前文件和暫存區文件差別,應用在提交前確認的場景

b.) 比較兩次提交記錄:

$ git diff <commit-id1> <commit-id2> # 比較兩次提交之間的差別

4. 查看歷史操做記錄

每一次當前HEAD發生改變(包括切換branch, pull, 添加新commit)一個新的紀錄就會被添加到reflog

$ git reflog

4、操做管理

1. 更新

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   # 清除暫存列表

2. 提交

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

3. 提取

從別的分支同步一個commit到本分支

$ git cherry-pick <commit-id>

# 提取一個merge提交
$ git cherry-pick -m <parent-number> <commit-id>  # parent-number爲主線序號,通常是第一個,也便是1

4. tag標記

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

5、恢復管理

1. 恢復本地

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>   # 不保留當前修改,要小心,確認當前修改沒有用了

2. 恢復遠端

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強制推送

6、其它命令

1. 臨時忽略文件

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>

2. 清理

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

3. 幫助

$ git help

或查看某一條指令參數:

git <command> -n

7、常見問題

一、git密鑰0644權限問題:

linux服務器clone時報0644權限過大提示: WARNING: UNPROTECTED PRIVATE KEY FILE!
# 修改權限
$ chmod 0600 id_rsa*
相關文章
相關標籤/搜索