Git是目前世界上最先進的分佈式版本控制系統,版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統
創建一個版本庫並進行初始化,Git自動爲我們創建了唯一一個master
分支
提交更改,實際上就是把暫存區的所有內容提交到當前分支。
工作區與版本庫
工作區
就是你在電腦裏能看到的目錄
版本庫
工作區有一個隱藏目錄.git,就是Git的版本庫
創建版本庫
切換目錄位置 cd F:/task
顯示當前目錄位置 pwd
創建repository mkdir <file>
(在工作區生成文件夾)
初始化repository git init
//把這個目錄變成Git可以管理的倉庫
(初始化後,在當前目錄下會出現一個名爲.git的目錄,所有git需要的數據和資源都存放在這個目錄中,.git目錄,這個目錄默認是隱藏的,用ls -ah
命令就可以看見。
工作區文件操作
cat <file> //查看當前工作區文件具體內容
git checkout -- <file>//其實是用版本庫裏的最新版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
rm <file> //從工作區刪除文件
git版本庫暫存區操作
git add <file> //添加文件到暫存區
git add -u//只會處理已修改或者已刪除的文件,但是不會處理新建的文件
git reset HEAD file //將文件的版本庫的最新版本重新放回工作區(已add)
git版本庫操作
保存快照到分支: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^
//回退到當前工作區版本的上一個版本
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)
文件修改查看
git diff <file>//(add提交前)
//查看具體修改內容git diff HEAD -- readme.txt
//查看版本庫最新版本與工作區最新版本的區別
Git分支
每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支,所以分支就是一條commi時間線
。
一個項目可以對應多條分支,也可以對應一條分支
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 [email protected]: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用法和常見問題分析