廖雪峰git教程
git – Linus在2周內用c寫的
1.1 基本概念
- 版本控制系統,追蹤文本文件的改動,文件、視頻等二進制文件則不可追蹤(微軟的word也是二進制文件)
- HEAD 指向當前分支,表示當前版本(最新的提交)
- HEAD^ 上一版本
- HEAD^^ 上上版本
- HEAD~100 往上100個版本
- 創建Git版本庫時,Git自動為我們創建了唯一一個master分支
- 只要沒有git add,那么修改的內容就不會被放入暫存區,就不會被提交
- 遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的,但是origin這個名字一看就知道是遠程庫
1.2 常用指令
mkdir learngit
pwd -- 用于顯示當前目錄
ls -ah -- 可查詢隱藏的文件夾,如.git
cat -- 讀取文件的內容
rm test.txt -- 刪除文件
git init -- 將某個目錄變成Git可以管理的倉庫
git add -- 告訴git,把文件添加到倉庫(暫存區)git add . -- 將工作區中所有未跟蹤或者修改的文件添加到暫存區
git commit -m "" -- 把文件提交到倉庫(master分支)
git log -- 告訴我們修改的歷史記錄(由近到遠)
/ 或者只顯示一行 git log --pretty=oneline
git reset --hard HEAD^ -- 回退到上一版本
git reset --hard 1094a -- 回退到某一版本(需要知道commit id,并輸入前幾位)
git reflog -- 即使關閉了git bash之后,依然能記錄之前每個步驟
git status -- 查詢工作區的狀態(是否有新增文件,文件是否有修改,比如切回dev分支時,可以先查詢工作區的狀態)
git diff HEAD -- readme.txt -- 查看工作區和版本庫里面最新版本的readme文件的區別
git rm test.txt -- 你在工作區刪除了test,git status檢測到了,在確認要刪除后,使用git rm+git commit
git checkout -- test.txt -- 剛剛在工作區誤刪了test,但是暫存區還有,還原回來
git remote add origin -- 在本地創建了一個Git倉庫后,又想在GitHub創建一個Git倉庫,并且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作
git remote -- 查看遠程倉庫信息
git remote -v -- 顯示更詳細信息
git push -u origin master -- 實際上是把本地當前分支master推送到遠程(第一次推送加 -u)
git push origin master -- 之后再有提交,推送無需加-u
git clone + git倉庫地址(https或ssh,ssh協議速度最快)
git checkout -b dev -- 創建dev分支(-b 表示branch?創建并切換)
git branch -- 查看當前分支(當前分支前面會標一個*號)
git checkout master -- 先切回master分支,再合并
git merge dev -- 把合并指定分支(dev)到當前分支(master)
git merge --no-ff -m "不使用Fast forward模式合并" dev -- Fast forward模式下,刪除分支后,會丟掉分支信息
git branch -d dev -- 合并完成后,就可以放心地刪除dev分支了
git switch -c dev -- git的新命令,創建并切換到新的dev分支
git switch master
git log --graph -- 可以看到分支合并圖
vim 文件名 -- 當不同分支合并產生沖突時,可以查看文件
git log --graph --pretty=oneline --abbrev-commit -- 查看分支合并情況
git stash -- 把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作(場景:當前dev分支還沒開發完,不能進行提交,但有臨時緊急任務,需要新建分支來修復bug)
git stash apply + git stash drop -- 恢復工作區,或者:
git stash pop (恢復的同時把stash內容也刪了)
git stash list -- 查看被暫存的工作現場
git stash apply stash@{0} -- 恢復stash@{0}暫存
git cherry-pick 4c805e2 -- 能復制一個特定的提交(4c805e2,修復bug的提價)到當前分支(比如在master分支上修復了bug,但是dev分支上也有這個bug,通過復制的方式解決dev上的bug)
git branch -D feature -- 丟棄一個沒有被合并過的分支,加-D強行刪除
git tag v1.0 -- 打標簽(默認標簽是打在最新提交的commit上的)
git tag v0.9 f52c633 -- 在歷史提交的特定commit id上打標簽
git tag -a v0.1 -m "version 0.1 發布" 1094adb -- 添加備注
git tag -d v0.1 -- 刪除標簽
git tag -d v0.9 + git push origin :refs/tags/v0.9 -- 刪除已推送到遠程的標簽
git push origin v1.0 -- 推送標簽到遠程
git push origin --tags -- 一次性推送全部尚未推送到遠程的本地標簽
git tag -- 查看所有標簽
git show v0.9 -- 查看某標簽的詳細信息
寫了不該寫的,但是還沒git add,使用git checkout -- readme.txt
可以撤銷工作區的修改;
寫了不該寫的,還git add了,使用git reset HEAD readme.txt
可以撤銷暫存區的修改
命令git checkout – readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷,這里有兩種情況:
一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。
命令git rm用于刪除一個文件。如果一個文件已經被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內容。
1.3 創建合并分支過程圖
分支合并沖突
手動修改沖突后,不需要merge了
1.4 多人協作
多人協作的工作模式通常是這樣:
- 首先,可以試圖用git push origin < branch-name>推送自己branch-name分支的修改;
- 如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合并;
- 如果合并有沖突,則解決沖突,并在本地提交(即使沒有沖突,后push的同學不得不先pull,在本地合并,然后才能push成功);
- 沒有沖突或者解決掉沖突后,再用git push origin < branch-name>推送就能成功!
如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream-to=origin/dev dev(指定本地dev分支與遠程origin/dev分支的鏈接)
1.5 記錄一個在學習git的過程中,遇到的問題
-
學習時,使用了以前創建的
ying
文件夾,這個文件夾其實和以前github上的ying倉庫關聯了(但是我忘了這件事)
-
當我在推送ying工作區的內容到
learngit2020
時,出現以下錯誤。因為此時,我的本地ying
和遠程倉庫的內容已經不一致了
-
先使用
git pull --rebase origin master
取回遠程主機某個分支的更新,再與本地的指定分支合并 (變基:把分叉的提交歷史“整理”成一條直線,看上去更直觀)
看看此時的工作區,多出了Users
文件夾:
-
再執行
git push -u origin master
看看遠程倉庫ying
的變化,最新的已經更新上去了
** 注意:這里并沒有實現推送到新的遠程倉庫learngit2020
-
本地庫
ying
關聯到遠程庫ying
后,再關聯到另一個遠程庫learngit2020
git remote set-url origin git@github.com:StephanieHuang0801/learngit2020.git
git push origin master:master
現在看看遠程庫learngit2020