(參照莫煩教程morvanzhou.github.io/tutorials/others/git/)
1.windos下安裝
git為windows提供了.exe的安裝包,進入https://git-scm.com/download/win,選擇對應的版本,按照默認安裝參數安裝即可。成功安裝后,會在所有程序中出現一個git文件夾,里面有一個Git Bash,之后的命令行操作都可以在這個Git Bash下完成。
2.創建git版本庫
init
首先選擇要對那個文件夾進行git管理,創建一個文件夾stud,打開Git Bash窗口,cd到stud目錄下
使用git config 添加name和email,這樣可以更好的記錄每一個記錄每一個修改的人
使用git init 對該文件進行git管理
提示已經建立了一個空的git管理庫
創建一個1.py文件, .git文件夾下存放的為git的一些配置管理文件
status
使用git stauts 可以查看當前版本庫的狀態
on branch master 提示當前分支在master上,紅色的1.py表示1.py的文件還未被加入版本庫,提示使用git add <file>添加至版本庫
add
使用git add 1.py將1.py文件添加至版本庫,還可以使用git add .命令,表示一次性添加所有未被添加的文件
可以看到使用git add 1.py之后再使用git status查看出現了綠色的1.py,表示1.py已添加至版本庫
commit
使用git commit -m "creat 1.py"將添加至版本庫的1.py文件提交,-m參數表示為此次更改添加的注釋
可以看到提示1 file changed
3.修改日志、查看修改內容(log、diff)
log
使用git log 命令可以查看提交的修改記錄,可以看到commit的id號有二三十位字母加數字組成,Author為log config 中配置的name和email,date和注釋。git log --oneline查看提交修改記錄,顯示為一行commit id這里只取7位,注釋。
編輯1.py加入a = 1,然后git status查看狀態,git add . 添加改動至版本庫,git commit -m "change 1"提交修改至版本庫,使用git log 可以查看到所有提交修改的信息。
diff
修改1.py ,a = 2 b = 1。
沒有使用git add .之前,查看1.py與上次commit的1.py的不同使用git diff 查看,紅色的-a = 1表示刪除了 a = 1,綠色的+a = 2 +b = 1表示添加了a = 2 b = 1
使用 git add .添加1.py至版本庫之后,1.py變成了可提交狀態,此時使用git diff --cached查看1.py與commit之前的1.py的不同,可以看到此時使用git diff沒有任何返回。
再次修改1.py 添加c = b,此時a = 2, b = 1已結通過add添加至版本庫,c = b的修改未add,使用git diff HEAD 可以查看這種類型的未commit和commit的不同,下圖對比了三種diff的不同
git diff HEAD --filename查看工作區(未add到暫存區)和本地版本庫最新修改的文件不同 ? ? ? ? ? ? ? ? ? git diff --filename 查看工作區和版本庫的文件不同 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? git diff --cached ?--filename 查看暫存區和版本庫的文件不同
修改已commit 的版本
復制1.py文件,重命名為2.py,想要吧2.py也寫進之前的commit進change2中怎么做呢,可以使用git commit --amend --no-edit (--no-edit不編輯直接合并到上一個commit)
回到過去reset
回到add之前
有時add了修改,又想回到add之前在添加一些修改,可以使用git reset 命令。
編輯1.py,添加d = 1,git add添加至版本庫,然后使用git reset 1.py命令可以回到add之前
git status -s直接顯示文件的狀態,是否添加至版本庫,綠色的M表示添加至版本庫,紅色的M表示未添加至版本庫
回到commit之前
每個commit都有一個id號,HEAD是一個指針,指引當前狀態是哪個commit,要想回到commit之前,需要讓HEAD回到過去,并reset到之前的HEAD。
git reset --hard HEAD會把當前工作目錄中未提交的所有內容清空,git reset --hard HEAD^或git reset --hard id號回到上一個commit
可以看到change2消失了
恢復change2,git reflog 查看所有分支的操作記錄,使用git reset --hard id號可以恢復change2
回到從前(checkout針對單個文件)
上面做的都是讓整個版本庫回到commit 之前,只想讓某單個文件回到commit之前,可以使用git checkout id號 -- 文件名
git checkout id -- 1.py之后可以看到1.py回到了上次commit的內容,git status看到此時相當于change2中1.py有修改可以提交,使用git commit -m ""back to change ”提交修改,提交之后之前的change2還存在,又產生了一個新的commit記錄,但是1.py文件的狀態已經回到了c1a24fc時的狀態,這就是與reset的區別,reset之后整個版本庫會回退至c1a24fc的狀態,change2的commit記錄會消失
分支
git branch dev 新建名為dev的分支,git branch查看分支, git checkout dev 切換分支,git checkout -b+分支名,可以直接創建和切換分支,git branch -D dev 刪除某個分支
在分支中修改文件和在master中修改文件是一樣的, -am add所有改變并直接commit
將dev的修改merge推送至master,先使用git checkout master從dev切換分支master,再git merge dev,使用git merge dev 在git log 下不會有commit信息,使用git merge --no-ff -m "keep merge info" dev可以保留merge的commit 信息
merge 分支沖突
可能會有這樣的情況,當你在dev分支上進行開發,有人在master上更改了遺留的bug,這個時候當你開發完dev想merge dev到master的時候就會出現沖突了
merge的時候提示出現沖突了
之所以沖突是因為1.py在master和dev上是不同的,打開1.py可以看到git已經把沖突的部分幫我們標記出來了,手動修改下1.py文件
git標記的1.py沖突部分
手動解決沖突之后的1.py
這個時候再進行merge,可以看到這次可以成功merge
rebase分支沖突
rebase也可以進行合并,當有一個共享的分支master和一個當前正在開發的dev分支,當master分支修改了之前遺留的一些bug后,我想試試看修復這些bug之后的版本是否和我的dev分支兼容,這個時候可以使用rebase.(rebase相當于提取了當前的修改,然后將其復制到了目標分支之后,這樣可以在dev分支上看到之前發生在master上面的修改log)
在master分支下使用git reset --hard id命令回到之前未merge的狀態
可以看到這時,1.py在master和dev中都有不同的修改,因為我們想在dev上rebase master,使用git checkout dev切換至dev分支,這時通過rebase進行合并,可以看到提示文件沖突了,這個時候使用git branch可以看到此時不在HEAD即不在dev也不在master上
vi 1.py 去手動處理掉沖突,然后 git add . 再git rebase --continue可以看到此時rebase成功了,使用git log --oneline可以看到,dev里面加入了master的commit記錄,這里和merge不同,merge會創建一個新的commit記錄去進行base、目標分支的合并。
使用rebase時只能在自己的分支下面rebase,不可以在共享的分支下進行rebase,這樣的話會將master中的commit歷史改變
stash
git stash用來暫存當前工作區的內容,讓工作區的內容回到和上一次commit的內容一致。這個時候就可以在當前分支下新建一個新的分支內容和當前分支內容一致了
git stash list 用來查看當前stash中的緩存,git stash pop用來提取之前暫存的內容
git下忽略文件
在創建的git倉庫文件夾下新建一個.gitignore文件。
# 忽略*.o和*.a文件
*.[oa]
# 忽略*.b和*.B文件,my.b除外
*.[bB]
!my.b
# 忽略dbg文件和dbg目錄
dbg
# 只忽略dbg目錄,不忽略dbg文件
dbg/
# 只忽略dbg文件,不忽略dbg目錄
dbg
!dbg/
# 只忽略當前目錄下的dbg文件和目錄,子目錄的dbg不在忽略范圍內
/dbg
github
注冊自己的github賬號,在git bash中生成一對秘鑰,在github setting 中添加ssh key
在github上創建一個倉庫,在本地新建一個文件,使用git bash cd進這個文件,然后創建一個README.md文件,使用git config 命令添加name和email,git init 對該文件進行git 管理,使用git commit -am 提交新添加的README.md文件,使用git remote add origin +git倉庫url(第一次提交項目需使用這行命令將本地倉庫與遠程的倉庫建立一個鏈接,origin相當于是倉庫url的別名)
git push -u origin master將修改提交到遠程倉庫(這里的-u參數相當于指定origin為默認的主機)
git push -u origin dev提交dev分支到遠程倉庫
git branch -D dev 刪除本地dev分支,git push -u origin :dev刪除遠程倉庫中的dev分支(:+分支名表示刪除分支)
git clone +git倉庫url,下載整個項目
git pull -u origin master 將當前master分支的更改更新到本地