在Git官網上有詳細的安裝方式 起步 - 安裝 Gitcss
// 全局配置 --global
git config --global user.name 'your_name'
git config --global user.eamil 'your_eamil@domin.com'
複製代碼
config
的三個做用域(local、global、system
)html
git config --local (local只針對某個倉庫有效)
git config --global (global對當前用戶的全部倉庫有效)
git config --system (system對系統全部登陸的用戶有效,基本不用)
複製代碼
顯示config
的配置,加--list
node
git config --list --local
git config --list --global
git config --list --system
複製代碼
清除設置git
git config --unset --local user.name
git config --unset --global user.name
git config --unset --system user.name
複製代碼
兩種場景github
cd 進入項目所在的文件夾
git init
複製代碼
cd 進入某個文件夾
git init your_project #會在當前路徑下建立和項目名同名的文件夾
cd your_project
複製代碼
git config --local user.name 'your_name'
git config --local user.eamil 'your_eamil@domin.com'
複製代碼
touch的做用是更改一個文件或目錄的時間。touch readme.MD 若是readme.MD不存在,則建立空文件readme.MD
touch readme.MD
複製代碼
git add readme.MD
git status 查看文件狀態
git commit -m 'Add readme'
git log 查看日誌
複製代碼
若未add,直接commit或git status則會報以下錯誤(untracked files) web
config
的設置中,local
的設置的優先級要高於global
算法
添加文件後直接commit
會報錯,緣由是什麼?shell
工做目錄 ---> 暫存區 ---> 版本歷史npm
1. git add files 將文件添加到暫存區
2. git commit
複製代碼
cp
命令來拷貝文件json
clear
清理屏幕
git add -u (u表明update,表明將已經被git管理的文件一塊兒提交到暫存區)
複製代碼
git mv
將readme
文件重命名爲readme.md
mv readme readme.md
git status
複製代碼
發現git提示,你 deleted: readme,並新建了 read.md
以上問題的解決方法
git add readme.md 添加
git rm readme 刪除
git status
複製代碼
上述操做後提示,修改爲功
renamed: readme -> readme.md
複製代碼
git reset --hard 將剛纔的修改撤回
複製代碼
以上操做能夠用一個更簡單的命令解決
git mv readme readme.md
複製代碼
這樣就用git mv
一個步驟解決了變動文件名
git log
查看版本演變歷史git log 查看提交的完整信息
git log --oneline 只查看commit內容
git log -n4 查看最近4個
git log -n4 --oneline 組合使用
複製代碼
git branch -v 查看本地有多少分支
git checkout -b testing 4323c83dcdf 基於以前的某個分支建立testing分支
複製代碼
git commit -am "add testing file" 將工做區的內容直接建立到版本歷史庫中
git branch -av 查看有多少分支
複製代碼
git log 查看當前分支的歷史
git log --all 查看全部分支的歷史
git log --all --graph 經過圖像化的方式查看log
git log --oneline
git log --oneline --all
git log --oneline --all -n4
git log --oneline --all -n4 --graph
git log --oneline --all testing 指定的testing分支不起做用
複製代碼
git help --web log 經過web查看git的全部命令
複製代碼
在命令行輸入以下命令:
gitk
複製代碼
不過這個圖形界面的清晰度有待提升
cheery-pick
就是挑選某一次的commit
提交放到另外一個分支
尊重版權,顯示 Author
和Committer
.git
目錄進入.git
文件
cd .git
ls -al
複製代碼
HEAD
文件cat HEAD
顯示
ref: refs/heads/RELEASE // 顯示當前所在分支RELEASE
git checkout testing // 切換分支
cat HEAD // 再次查看HEAD文件
ref: refs/heads/testing // 顯示當前所在分支爲testing
複製代碼
config
文件cat .git/config
複製代碼
顯示當前項目的基礎配置信息
refs
文件夾(引用:存放tag和tag的信息)cd refs
ls -al
顯示目錄文件夾
heads // 分支 drwxr-xr-x d表明文件夾
tags // 標籤(里程碑標識)
cd heads/
顯示文件夾
RELEASE
testing
cat RELEASE
acedf122defesci*******
git cat-file -t acedf122defesci******* // 查看類型 表明RELEASE的指針指向哪個commit
commit // 顯示爲commit類型
git branch -av // 查看分支進行驗證
// 驗證testing分支
cat testing
acedf122defesci******* // 哈希值若是足以標誌惟一性則顯示的較短,不然則顯示的較長
複製代碼
objects
,是git
文件系統的核心內容(只要任何文件的文件相同,就是惟一的blob,這樣設計的好處是什麼呢?)cd objects/
ls -al 查看詳情
cd 任意文件夾
ls -al
tree 是一棵樹
看樹的內容用
git cat-file -p acedf122defesci******* // 查看類型
git cat-file -p fresfer3432cxrff******* // 查看到多是css文件
複製代碼
commit
、tree
和bolb
三個對象之間的關係存儲是git
的核心技術點,git
提供優良的存儲能力,對版本控制系統是很是關鍵的。由於版本控制系統就是管理文檔,但文檔的變動是很頻繁的,若是沒有一套好的存儲機制的話,庫就會愈來愈大,性能就會愈來愈差。所以設計一個良好的存儲機制,對版本控制系統來講很是關鍵!
Git
對象彼此關係三者之間的關係
commit
一個commit
對應一棵樹tree
(文件夾),表明取出某個commit,快照,經過樹呈現出來。
tree
包含index.html readme styles,每一個文件都是一個blob,blob和文件名沒有任何關係,只要內容相同,就是惟一的blob,能夠大大的節約存儲空間。
blob
對不一樣的文件用cat
命令能夠進行查看
小結:
commit
中必定有一棵樹tree
裏必定包含那個時間點到底包含了什麼文件夾,什麼文件blob
tree
的個數新建的git倉庫,有且僅有一個commit,僅僅包含/doc/readme,請問內含多少個tree,多少個blob?
git init
ls-al
mkdir doc
git status // 沒有變化
echo "hello,world!" > readme 建立readme並寫入hello,world!
cd ../
git status
find .git/objects -type f // 空的
git add doc
git status
find .git/objects -type f // 有值,建立了blob
git commit -m "add readme"
find .git/objects -type f // 變成了4個object
git cat-file -t 083e18d // tree
git cat-file -p 083e18d // doc
git cat-file -t 2d832d90
git cat-file -p 2d832d90 // hello,world!
複製代碼
git log
查看提交記錄。
git cat-file -p 5e15bae4036c9
tree
git cat-file -p 18baf1927939c1d88ab
README.md 、package.json
等
blob
類型的文件和
public
等
tree
類型的文件夾
從上面的例子,咱們就可總結出git中commit
、tree
、blob
之間的關係。
git branch -av
git log
git checkout c4ccf8ffceb142 // 輸出了以下信息
複製代碼
You are in 'detached HEad' state.
正處於分離頭指針狀態。本質就是正工做在一個沒有分支的狀態下。 在如今的狀態下有了commit,又切到了其餘分支工做,這樣在分離頭指針狀態下寫的內容,極可能被git當作垃圾清理掉。因此,你想作修改變動,必定要與某個分支掛鉤。
git commit -am"Change style" // add + commit
git checkout RELEASE // 切換以後有以下提示
複製代碼
gitk --all
git branch fix_css c4ccf8ffceb142 // 根據指示信息新建分支,進行保留
git log 進行查看
複製代碼
HEAD
和branch
HEAD
不只能夠指向某個分支,還能指向某個commit
git checkout -b fix_readme fix_css // 基於fix_css分支建立一個新的分支fix_readme,並切到新分支fix_readme
git log -n1 // (HEAD指向了新的分支)
gitk --all
cat .get/HEAD // ref: refs/heads/fix_readme
git diff 3ede435ded 490ikl9jjih // 查看兩個commit的diff
// HEAD也能夠用來快速的指代
git diff HEAD HEAD~1 // 當前和父親的比較
git diff HEAD HEAD^ // 當前和父親的比較
git diff HEAD HEAD^^ // 當前和父親的父親的比較 等同於git diff HEAD HEAD~2
複製代碼
gitk -all
git branch -d fix_readme // 刪除fix_readme分支
git branch -D fix_readme // 強制刪除fix_readme分支
git branch -av // 查看剩餘的分支
複製代碼
不能在當前分支刪除當前分支
commit
的message
git log -1 // 查看最近一次commit
git commit --amend // 便可修改這次commit信息
複製代碼
commit
的message
變基 rebase
Rebase主要有兩種場景:1.合併屢次提交記錄 2.合併分支
在Git
中整合來自不一樣分支的修改主要有兩種方法:merge
和rebase
。
merge
合併的結果是把兩個分支的最新快照以及二者最近的公共祖先進行三方合併,合併的結果是生成一個新的快照(並提交)。rebase
則是另外一種方法,這種操做就叫作變基
。你可使用rebase
命令將提交到某一分支上的全部修改都移至另外一分支上,就好像「從新播放」同樣。它的原理是首先找到這兩個分支(即當前分支 experiment、變基操做的目標基底分支 master)的最近共同祖先 C2,而後對比當前分支相對於該祖先的歷次提交,提取相應的修改並存爲臨時文件,而後將當前分支指向目標基底 C3, 最後以此將以前另存爲臨時文件的修改依序應用。 merge和rebase,這兩種整合方法的最終結果沒有任何區別,可是變基使得提交歷史更加整潔。 你在查看一個通過變基的分支的歷史記錄時會發現,儘管實際的開發工做是並行的,但它們看上去就像是串行的同樣,提交歷史是一條直線沒有分叉。
變基操做的實質是丟棄一些現有的提交,而後相應地新建一些內容同樣但實際上不一樣的提交。 若是你已經將提交推送至某個倉庫,而其餘人也已經從該倉庫拉取提交併進行了後續工做,此時,若是你用 git rebase 命令從新整理了提交併再次推送,你的同伴所以將不得再也不次將他們手頭的工做與你的提交進行整合,若是接下來你還要拉取並整合他們修改過的提交,事情就會變得一團糟。
總的原則是,只對還沒有推送或分享給別人的本地修改執行變基操做清理歷史,從不對已推送至別處的提交執行變基操做,這樣,你才能享受到兩種方式帶來的便利。
git rebase -i 27de432fe(要修改的父級的commit哈希) 將pick改成r 對修改後的文件進行保存。自動彈出另外一個界面。此時便可修改這次commit文案
複製代碼
要修改的父級的commit哈希
用r
進行修改,r
表明reward
,只修改commit信息,出現以下信息
git log // 你會發現修改commit以後,hash值也發生了修改
git log -n5 --graph
複製代碼
能夠對任何一次commit進行修改
變基:基於某個基礎進行變更
git:(mater) git checkout -b feature1
複製代碼
hotfix
,併合併入了master
分支,此時master
已經領先於你的feature1
分支了:master
分支的改動同步到
feature
分支,咱們經常使用的爲
merge
,執行:
git:(feature1) git merge master
複製代碼
合併以後的結果如上圖,執行:
git:(feature1) git log
複製代碼
就會在記錄裏發現一些merge
信息,可是咱們以爲這樣污染了commit
記錄,想要保持一份乾淨的 commit
,此時,git rebase
就排上用場了。
hotfix
後合併 master
的步驟:rebase
:git:(feature1) git rebase master
複製代碼
這裏rebase
作了什麼呢?
首先,git 會把 feature1 分支裏面的每一個 commit 取消掉;
其次,把上面的操做臨時保存成 patch 文件,存在 .git/rebase 目錄下;
而後,把 feature1 分支更新到最新的 master 分支;
最後,把上面保存的 patch 文件應用到 feature1 分支上;
複製代碼
從commit
記錄能夠看出,feature1
分支是基於hotfix
合併後的master
,feature1
便成爲了最領先的分支,並且沒有merge
的commit
記錄,看起來舒服多了。
rebase
的過程當中,可能會出現衝突conflict
。此時,git
會中止rebase
並會讓你去解決衝突。在解決衝突後,用git add
去更新這些內容。注意:add以後不要執行git commit,須要執行git rebase --continuegit rebase --continue
複製代碼
這樣git會繼續執行餘下的patch
補丁文件了。
--abort
命令參數來終止rebase
的行動,而且分支會回到rebase
開始前的狀態。git rebase --abort
複製代碼
附:merge到一半如何取消合併
git merge --abort
複製代碼
附:解決衝突git merge
與git rebase
中的ours
和theirs
git merge
與git rebase
的區別:git rebase
不會產生額外的commit
。在實際項目中,不一樣的公司傾向的使用方法不同,rebase
能使commit是一條線,相對較爲清晰,而merge
則能完整的記錄全部的操做,相對更加完整。
解決衝突:merge
的時候,用git checkout --theirs
留下傳入的,用git checkout --ours
留下當前的。 rebase
的時候,用git checkout --ours
留下傳入的,用git checkout --theirs
留下當前的。 在merge
時,ours
指代的是當前分支,theirs
表明須要被合併的分支。而在 rebase
過程當中,ours
指向了修改參考分支,theirs
倒是當前分支。 merge
和rebase
對於ours
和theirs
的定義是徹底相反的。
commit
整理成1個squash
合併最近的4次提交記錄:
git rebase -i HEAD~3
複製代碼
這時候,會自動進入vi
編輯模式:
s cacc52da add: qrcode
s f072ef48 update: indexeddb hack
s 4e84901a feat: add indexedDB floder
s 8f33126c feat: add test2.js
# Rebase 5f2452b2..8f33126c onto 5f2452b2 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
複製代碼
並提示了以下幾個命令
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like 「squash」, but discard this commit’s log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
複製代碼
將你須要合併的提交的記錄前綴改成s
s cacc52da add: qrcode
s f072ef48 update: indexeddb hack
s 4e84901a feat: add indexedDB floder
p 8f33126c feat: add test2.js
複製代碼
若是保存的時候,你碰到了這個錯誤:
error: cannot 'squash' without a previous commit // 注意不要合併先前提交的東西,也就是已經提交遠程分支的紀錄。
複製代碼
若是你異常退出了 vi 窗口,沒關係張:
git rebase --edit-todo
複製代碼
這時候會一直處在這個編輯的模式裏,咱們能夠回去繼續編輯,修改完保存一下:
git rebase --continue
複製代碼
查看結果
git log // 兩次提交合併成了一次,減小了無用的提交信息。
複製代碼
git rebase -i r435dr34oi4od // 多個變動的父commit的hash值
複製代碼
將連續的幾個commit合到一個commit中
好比git中有兩個關於readme的修改,可是是不連續的,如何將這兩個commit合併爲同一個?
git rebase -i 43s4dreji34fc3 // 父級commit
複製代碼
將兩個要合併的commit放在一塊兒,使用s
命令
git rebase --continue // 將commit合併
git status
gitk --all // 用樹形結構查看,出現了兩個沒有祖先的commit
複製代碼
將剛提交的commit
撤回
git reset --soft HEAD^ // 撤回上一次的提交,並保留代碼
複製代碼
HEAD^的意思是上一個版本,也能夠寫成HEAD~1
若是你進行了2次commit,想都撤回,可使用HEAD~2
--mixed --soft --hard
這幾個參數的區別:
--mixed
不刪除工做空間改動代碼,撤銷commit,撤銷git add . ,這個爲默認參數,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是同樣的。--soft
不刪除工做空間改動代碼,撤銷commit,不撤銷git add .--hard
刪除工做空間改動代碼,撤銷commit,撤銷git add . ,注意完成這個操做後,就恢復到了上一次的commit狀態。若commit
註釋寫錯了,能夠執行下面的代碼:
git commit --amend
複製代碼
此時會進入默認vim編輯器,修改註釋完畢後保存就OK了。
將暫存區的文件和當前分支最近的一次commit作比較
此時已經執行過git add
,文件提示已變爲綠色,此時須要--cached
命令來查看暫存區的diff
git diff --cached // 查看暫存區
複製代碼
bare repository
裸倉庫,即.git
下的內容
git diff -- index.html
複製代碼
git diff
默認比較工做區和暫存區的區別
使用情景:將文件放入到暫存區以後,在工做區又有了一次修改,感受比暫存區的要好,此時就想把暫存區的刪除掉,恢復成和HEAD的同樣。
git reset HEAD // 將全部的暫存區的文件取消掉,回到了工做區
git diff --cached // 驗證暫存區與HEAD是否一致
複製代碼
git add index.html
git diff --cached // 暫存區
git status
// 根據提示
git checkout -- index.html
複製代碼
變動工做區用git checkout
,變動暫存區用git reset
.
git reset HEAD -- index.html // 將暫存區的文件撤回到工做區
複製代碼
git branch -av
git log
git reset --hard 5def35df890d // 回到某次提交以前,以前的將會被刪除
複製代碼
回到你指定的commit的hash值的時候,以前的將會被刪除
git log -n8 --all --graph // 查看最近8次的提交,全部分支的狀況
git diff temp master // 查看temp和master全部的區別
git diff temp master -- index.html // 查看temp和master中index.html的區別
git branch -av
git diff 5df3fd1 03defx53 -- index.html // 用hash的方式查看
複製代碼
此種查看方式都是查看最新的一次提交
rm readme // 工做區刪除
git rm readme // 暫存區刪除
git reset --hard HEAD // 恢復到了和頭指針相同的狀態
複製代碼
其實只須要下面這一條命令便可:
git rm readme // git rm + 具體文件,直接將刪除的文件放在暫存區,就不須要在工做路徑下刪除文件了
複製代碼
git stash // 存放起來
git stash pop // 釋放出最新的stash
git stash list // 查看stash信息,是否還存在
git stash apply // 1.把以前存放的文件釋放出來,2.stash中的信息還存在
git reset --hard HEAD // 使其與頭指針相同
複製代碼
pop
與apply
的區別:.gitignore
文件名不能修改,不然將會失效
# gitignore
HEAD
.cache
v*
alias
# For testing
test/bak
.urchin.log
.urchin_stdout
test/**/test_output
node_modules/
npm-debug.log
.DS_Store
current
/default-packages
# Only apps should have lockfiles
npm-shrinkwrap.json
package-lock.json
yarn.lock
複製代碼
ls -al
vi .gitignore
rm -rf doc // 刪除doc文件夾
複製代碼
啞協議與智能協議:
備份特色:可多點備份
git push // 將本地的變動push到遠端
git fetch // 將遠端的變動直接拉到本地
git clone --bare https://****** // 不帶工做區的裸倉庫
git push 遠端名稱
複製代碼
官網https://github.com/
將本地和遠程進行鏈接
在git中找到help
,搜索ssh
Adding a new SSH key to your GitHub account
cd ~/.ssh
複製代碼
若已經存在,須要將本地的ssh進行備份
存在一對公私鑰的文件
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
複製代碼
再次查看文件夾: id_rsa
爲私鑰,id_rsa.pub
爲公鑰。
cat id_rsa.pub // 查看公鑰,以下圖,須要將下面的內容粘貼到遠端的github帳戶
複製代碼
ssh key
用ssh協議的好處: push時不須要用戶名和密碼了,能夠智能識別
Description
:可讓別人快速的搜到你的項目
Add .gitignore
Add a license
MIT License
開源協議
git remote -v
git remote add github ****** // 新增遠端站點
複製代碼
fetch
:從遠端拉最新的代碼
fast-forward
git pull // 1. git fetch 2.git merge
git fetch origin ***** // 將遠端分支拉到本地,還未與本地的分支產生關聯
git branch -v // 查看本地分支
git branch -va // 查看遠端分支
git merge github/master // fatal: refusing to merge unrelated histories
讓兩個歷史不想關的樹merge到一塊兒
git help
相同的分支非fast forward
git merge --allow-unrelated-histories github/master // 基於遠端生成了一個新的commit
git push origin master
複製代碼
git remote -v 查看遠程版本庫信息
git remote add githup <url> 添加githup遠程版本庫
git fetch githup 拉取遠程版本庫
git merge -h 查看合併幫助信息
git merge --allow-unrelated-histories githup/master 合併githup上的master分支(兩分支不是父子關係,因此合併須要添加 --allow-unrelated-histories)
git push githup 推送同步到githup倉庫
複製代碼
在不用merge用rebase的狀況下怎麼操做
1)先把遠端的分支 fetch到本地,而後,再執行 rebase 。
2)直接 git pull --rebase 。
複製代碼
fast forward究竟是
兩我的修改了不一樣的文件
git add -u
git commit -m ""
git push
git branch -av
git fetch // 將遠端的分支拉到本地
git checkout -b feature/add_commands remotes/add_commands
git pull // note about fast-forwards 要變成fast-forwards的關係
git fetch // [ahead 1, behind 1] 遠端有一個commit比本地的新
git merge // merge 遠端分支
git push
複製代碼
標籤管理
git tag // 查看全部標籤
git tag name // 建立標籤
git tag -a name -m "comment" // 指定提交信息
git tag -d name // 刪除標籤
git push origin name // 標籤發佈
複製代碼
add
,commit
或push
的提交命令
reset
是重置的意思。多觀察一下git reset
這個命令。
git reset 【commit ID】
git revert 【commit ID】 // revert能夠保留完整的歷史記錄。對於和其餘人協同的項目,使用git rever是最好的。
複製代碼
git reset 146bd5*****27da72 html/commons/index.html 經過hash直接將某個文件回退到
git checkout html/commons/index.html 回退以後,只是回退到了暫存區,此時還須要用checkout命令將本地的文件刪除掉,再進行commit等操做,這樣本地文件就與遠程一致了
git push --force
複製代碼
commit
以後撤回:
git reset --soft HEAD^ (HEAD~1)
撤銷多個commit HEAD~n // 可進行嘗試
參數含義:
--mixed: 不刪除工做空間改動代碼,撤銷commit,而且撤銷git add .
--soft: 不刪除工做空間改動代碼,撤銷commit,不撤銷git add .
--hard: 刪除工做空間改動代碼,撤銷commit,撤銷git add .
複製代碼
commit
註釋寫錯,改註釋
git commit --amend
複製代碼
持續更新...