Git是目前世界上最早進的分佈式版本控制系統,版本控制是一種記錄一個或若干文件內容變化,以便未來查閱特定版本修訂狀況的系統html
建立一個版本庫並進行初始化,Git自動爲咱們建立了惟一一個master
分支
提交更改,實際上就是把暫存區的全部內容提交到當前分支。git
工做區
就是你在電腦裏能看到的目錄
版本庫
工做區有一個隱藏目錄.git,就是Git的版本庫github
切換目錄位置 cd F:/task
顯示當前目錄位置 pwd
建立repository mkdir <file>
(在工做區生成文件夾)
初始化repository git init
//把這個目錄變成Git能夠管理的倉庫
(初始化後,在當前目錄下會出現一個名爲.git的目錄,全部git須要的數據和資源都存放在這個目錄中,.git目錄,這個目錄默認是隱藏的,用ls -ah
命令就能夠看見。segmentfault
cat <file> //查看當前工做區文件具體內容 git checkout -- <file>//實際上是用版本庫裏的最新版本替換工做區的版本,不管工做區是修改仍是刪除,均可以「一鍵還原」。 rm <file> //從工做區刪除文件
git add <file> //添加文件到暫存區 git add -u//只會處理已修改或者已刪除的文件,可是不會處理新建的文件 git reset HEAD file //將文件的版本庫的最新版本從新放回工做區(已add)
保存快照到分支:git commit -m '說明'
//提交更改,實際上就是把暫存區的全部內容提交到當前分支。
查看快照記錄:git log
網絡
git log --pretty=oneline //簡化信息,方便查看 git log --pretty=oneline --abbrev-commit git reflog //查看每一次commit以及reset,以便查看commit-id
版本回退:git reset --hard HEAD^
//回退到當前工做區版本的上一個版本app
HEAD^:上一個版本 HEAD^^:上上一個版本 HEAD~100:上100個版本 commit-id(對應版本id)
從版本庫刪除文件:git rm <file>
從遠程倉庫刪除文件:先在工做區刪掉,而後git commit -a -m "A file was deleted"
,最後git push分佈式
狀態查看:git status
三種狀態
1.untraked file(工做區的文件未被跟蹤的文件)
2.changes to be commited(暫存區的文件,將要被提交的修改)
3.changes not staged for commit(沒有準備提交的修改或文件以前提交過,而後進行了修改但還未add)gitlab
git diff <file>//(add提交前)
//查看具體修改內容git diff HEAD -- readme.txt
//查看版本庫最新版本與工做區最新版本的區別url
每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支,因此分支就是一條commi時間線
。spa
一個項目能夠對應多條分支,也能夠對應一條分支
HEAD
嚴格來講不是指向提交,而是指向master,master纔是指向提交的,因此,HEAD指向的就是當前分支。
建立分支並切換
一步完成:git checkout -b <name>
(-b參數表示建立並切換,)
兩步完成:
git branch <name>//建立分支 git checkout <name>//切換分支到當前分支
查看分支:git branch
合併分支:
git merge <name>//合併指定分支到當前分支,fast forward模式 git merge --no-ff <name>//能夠看出曾經合併過
合併分支時,加上--no-ff
參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併。--no-ff參數,表示禁用Fast forward
刪除分支:
git branch -d <name> git branch -D <name>//強行刪除
查看分支合併圖
git log --graph git log --graph --pretty=oneline --abbrev-commit//簡化信息
本地分支與遠程分支同步
git checkout -b branch-name origin/branch-name//在本地建立和遠程分支對應的分支 git branch --set-upstream branch-name origin/branch-name//創建本地分支和遠程分支的關聯
一個版本庫保存一個分支master,各自的版本庫保存着各自的分支,各自的主分支名稱都爲master。
發佈一個版本時,咱們一般先在版本庫中打一個標籤,這樣,就惟一肯定了打標籤時刻的版本。未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。因此,標籤也是版本庫的一個快照
。
標籤是指向某個commit的指針
打標籤:git tag <name>
//默認標籤是打在最新提交的commit上
git tag <name> commit-id(可選) git tag -a <name> -m '說明' commit-id(可選)
查看標籤:git tag
查看標籤信息:git show <tagname>
刪除標籤:git tag -d <tagname>//(本地)
推送標籤到遠程:
git push origin <tagname>//推送單個 git push origin --tags//推送多個
遠程倉庫是指託管在網絡上的項目倉庫,可能會有好多個,其中有些你只能讀,另外有些能夠寫
查看當前遠程庫列表:git remote
//它會列出每一個遠程庫的簡短名字git remote -v
//-v 選項,顯示對應的克隆地址
查看遠程倉庫信息git remote show [remote-name]
//查看某個遠程倉庫的詳細信息
添加遠程倉庫git remote add [shortname] [url]
刪除遠程倉庫git remote rm [remote-name]
遠程倉庫重命名git remote rename [old] [new]
遠程引用是對遠程倉庫的引用(指針),包括分支、標籤
等等。
遠程分支
git ls-remote//顯示得到遠程引用的完整列表
本地倉庫推送至遠程庫(推送分支) git push [remote-name] [branch-name]
推送分支,就是把該分支上的全部本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上
1.git remote add origin git@github.com:murphyuwu/task0001.git
//添加遠程倉庫origin
git push origin master//其實是把當前分支master推送到遠程庫origin。
2.git push -u origin master
//推送當前分支master
(加上了-u參數,Git不但會把`本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時就能夠簡化命令)
從遠程庫克隆倉庫到本地
從遠程倉庫克隆時,實際上Git自動把本地的master
分支和遠程的master
分支對應起來了,如圖
git clone git@github.com:murphyuwu/task0001.git
1.建立新分支時,新分支會指向現有分支最新的commit對象,以下圖。
2.現有分支在工做區以及暫存區的狀態,新分支也擁有一樣的狀態。
3.切換到新分支工做時,會改變以前的狀態,並與新分支同步。
正由於切換到新分支工做時,現有分支的狀態會與新分支的狀態保持同步,所以爲了不這一情況,能夠保住現有工做區的狀態,再切換到新分支工做,此時新分支的狀態就是乾淨的
git stash //保存當前工做現場 git stash drop //刪除保存 git stash apply //恢復現場,但並不刪除保存 git stash pop //恢復現場,並刪除保存 git stash list //查看保存工做狀況
Fast Forward
$ git checkout -b dev//建立並切換分支到dev分支
$ git add readme.txt $ git commit -m "branch test"//dev分支向前移一步
$ git checkout maste//切換到master分支 $ git merge dev//master向前一步與dev分支合併
$ git branch -d dev//刪除dev分支
衝突修改合併
git checkout -b feature1 $ git add readme.txt $ git commit -m "AND simple" $ git checkout master $ git add readme.txt $ git commit -m "& simple"
這種狀況下,Git沒法執行「快速合併」,只能試圖把各自的修改合併起來,但這種合併就可能會有衝突,收到修改衝突後提交
$ git add readme.txt $ git commit -m "conflict fixed"
1.master
分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
Force 「git push」 to overwrite remote files
gitlab和github下fork後如何同步源的新更新
git pull——git庫版本與本地庫版本衝突總結
git push用法和常見問題分析
The difference between git reset --mixed, --soft and --hard.