git工作區和本地倉庫 創建本地版本庫 mkdir learnGitcd learnGitgit init
添加到暫存區 touch learn.mdopen learn.mdgit add learn.md // 把工作區修改內容添加到暫存區git restore <file> //放棄工作目錄中文件的修改
git restore --staged <file> // 放棄工作目錄中文件的修改git commit -m '創建了一個learn文件' //commit 只提交添加到暫存區的修改touch more.mdtouch three.mdgit add .git commit '創建了兩個新文件'
查看工作區和暫存區狀態 git statusgit diff //查看具體不同的地方在哪
查看git提交歷史記錄 git loggit log --pretty=oneline //精簡git日志
git 一些命令git branch //查看本地所有分支git branch -r //查看遠程所有分支git branch -a //查看本地和遠程的所有分支 -a 所有git branch <branchname> //新建分支git branch -d <branchname> //刪除本地分支 -D 強制刪除// 刪除遠程分支第一種
git branch -d -r origin/<branchname> //刪除遠程分支內容git push origin :<branchname> //刪除后推送至服務器(成功刪除遠程分支)// 刪除遠程分支第二種
git push origin --delete <branchname> // 直接刪除遠程分支git branch -m <oldbranch> <newbranch> //重命名本地分支(移動舊分支到新分支上) -M 強制移動或重命名/***重命名遠程分支:*1、刪除遠程待修改分支git branch -d -r <branchname>*2、切換到新分支上git checkout 新分支*3、push本地新分支到遠程服務器git push 新分支名*/
通過指定提交記錄在git中移動git checkout f2dhex //通過節點hex值移動HEAD//相對引用git checkout master^ //讓HAEAD指向master的上一個提交節點git checkout master^^ //讓HAEAD指向master的前兩個提交節點git checkout master~3 //讓HAEAD指向master的前三個提交節點git branch -f master HEAD~3 //將 master 分支強制指向 HEAD 的第 3 級父提交。
git回退版本(工作區和暫存區沒提交到本地倉庫的內容會丟失) git reset 的用法
git checkout 如果不帶文件路徑 移動的是HEAD指針 ,如果帶文件路徑 移動的是HEAD指向的分支指針,(也就是checkout會改變HEAD指向的分支,直接指向了一個提交)
git reset 始終移動的是HEAD指向的分支的指針(而reset不會改變HEAD指向的分支)git reset [<mode>] [<commit>]git reset 將當前分支指向給定的版本,并根據模式的不同決定是否修改index和working tree。常用的有三種模式,--soft, --mixed, --hard,如果沒有給出<mode>則默認是--mixed--soft參數將會重置HEAD到制定的版本,并把本地文件的修改還原到暫存區(軟重置 soft:軟)git reset --soft HEAD^ //回退到上一個版本,提交的內容還原到暫存區--mixed參數將會重置HEAD到制定的版本,并把本地文件的修改還原到工作區 (混合重置)--hard參數將會重置HEAD到制定的版本,并清除本地文件的修改(硬重置 hard:硬)git reset --hard HEAD^ //回退到上一個版本 HEAD^^ 回退到上兩個版本git reset --hard 103a4d //到指定版本// 回退版本的前提是你還沒有提交到遠程倉庫
git查看歷史命令日志 git reflog
git工作區和版本庫 https://www.cnblogs.com/cposture/p/4178003.html 詳細介紹工作區/暫存區/倉庫
工作目錄(working tree) = git add . => 暫存區(.git/index文件) =git commit -m '' => 本地倉庫(.git/object)
git撤銷修改 git checkout -- learn.md //只撤銷工作區的修改,不會撤銷添加到暫存區的修改git reset HEAD <file> //把暫存區的修改撤銷掉(unstage),重新放回工作區:
git刪除文件 //工作區手動刪除了一個文件,讓版本庫和工作區保持一至、rm more.mdgit statusgit rm more.mdgit commit -m '刪除了文件more.md'// 工作區誤刪文件,用版本庫的恢復回來git checkout -- three.md //git checkout其實是用版本庫里的版本替換工作區的版本
git遠程倉庫 同步遠程倉庫 // 遠程倉庫并添加密鑰1. ssh-keygen -t rsa -C "wjsanshaoyan@163.com"2. 找到/Users/wangjing/.ssh/id_rsa.pub3. 復制粘貼里面全部內容到gitee的SSH4. ssh -T git@gitee.com(第一次輸入yes,讓gitee把我們的密鑰記錄下來,測試匹配成功沒// 關聯遠程倉庫git remote -v //看看有沒有關聯的遠程倉庫// 有 比如是origingit remote rm origin //刪除已關聯的名為origin的遠程庫git remote rename origin(以前的名字) oschina(要修改的名字) //修改遠程倉庫名字git remote set-url origin 倉庫地址 //修改倉庫對應的遠程倉庫地址// 沒有git remote add gitee git@gitee.com:wangjing5676/learnGit.git //再關聯碼云的遠程庫git remote add github git@gitee.com:wangjing5676/learnGit.git //還可以再關聯github的遠程倉庫// 關聯好以后git clone git@gitee.com::wangjing5676/learnGit.git [自定義名字]
//這里的賬號和密碼就是你加入git倉庫的用戶名和郵箱,輸入以后會在憑證里面存儲,以后就不用驗證了// 下面有一個注意點:如果建立了本地分支和遠程分支的跟蹤,那么git pull 和git fetch拉去的只是這個分支的最新內容 ,如果沒有建立那么拉取的將是遠程主機上的所有更新// 而且如果你拉了所有更新,在push到對應分支的話,其他分支和這個分支沖突的文件是不會提示的git pull gitee master //[git pull相當于git fetch和git merge的合并](https://blog.csdn.net/riddle1981/article/details/74938111)git pull gitee master --allow-unrelated-histories //容許合并不相關歷史git fetch origin //=把遠程主機的全部更新拉到本地git fetch <遠程主機名> <分支名> //取回特定分支的更新git merge 分支名 把遠程取回的更新合并到指定分支git push -u gitee master //把本地提交推送到遠程倉庫(-u表示跟蹤遠程分支,下一次直接git push)git pull origin master --allow-unrelated-histories// 合并本地和遠程倉庫如遇到遠程沒有歷史記錄的文件,用這個拉取
git本地分支 分支 git checkout -b dev // 加上-b相當于新增并切換到dev分支git branch //查看分支// 現在提交的內容在dev分支上git checkout master //切換到master分支git merge dev //把dev分支合并到master分支(實際上就是把master指針指向了dev分支最新提交)git branch -d dev //合并完成可以刪除dev分支cat.git/HEAD //查看HEAD指向git symbolic-ref HEAD //如果 HEAD 指向的是一個引用,還可以用 git symbolic-ref HEAD 查看它的指向
解決沖突 git checkout -b 分支名 //創建賓切換到新分支// ...修改些內容git checkout master //切換回master// ...修改些內容git merge 分支名 //合并// ...沖突產生,手動合并git add .git commit -m 'conflict fixed'git log --graph //看到分支合并圖git branch -d 分支名 //刪除這個分支git merge --no-ff -m "merge with no-ff" dev //--no-ff表示普通合并,合并后會提交一次,合并后的歷史有分支,能看出來曾經做過合并
存儲區 // [] 代表這是可選的[-u|--include-untracked] 所有未跟蹤的文件也會被藏起來,然后使用進行清理 git clean。[-a|--all] 所有被忽略和未跟蹤的文件也會被存放,然后用清除git clean。[--index] 嘗試不僅恢復工作樹的更改,而且恢復索引的更改。但是,當您有沖突時(存儲在索引中,因此您無法再像以前一樣應用更改),這可能會失敗。[-k|--[no-]keep-index] 已經添加到索引的所有更改均保持不變。[-p|--patch] 從HEAD和要隱藏的工作樹之間的差異中交互選擇塊。存儲項的構造應使其索引狀態與存儲庫的索引狀態相同,并且其工作樹僅包含交互式選擇的更改。然后,所選更改將從工作樹中回滾。請參閱git-add [1]的“交互模式”部分,以了解如何操作--patch模式。
--patch選項暗含--keep-index。您可以使用--no-keep-index覆蓋它。[-q|--quiet] 不顯示反饋信息[-- <pathspec>...] 新的存儲條目僅記錄與路徑spec 匹配的文件的修改狀態。然后,索引條目和工作樹文件將僅針對這些文件回滾到 HEAD 中的狀態,從而使與路徑規格不匹配的文件保持不變。[--pathspec-from-file=<file>] Pathspec在<file>中而不是命令行args中傳遞。如果<file>恰好-使用標準輸入。 Pathspec元素由LF或CR / LF分隔。可以按照配置變量core.quotePath的說明引用路徑規范元素(請參閱git-config [1])。另請參見--pathspec-file-nul和全局--literal-pathspecs。[--pathspec-file-nul] 僅對--pathspec-from-file有意義。 Pathspec元素用NUL字符分隔,所有其他字符按字面意義使用(包括換行符和引號)。git stash //把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作
git stash [push [--patch] [-k|--[no-]keep-index] [-q|--quiet][-u|--include-untracked] [-a|--all] [-m <message>] [-- <pathspec>...]] //將本地修改保存到新的存儲項,然后將其回滾到HEAD(在工作樹和索引中)。 <message>部分是可選的,提供說明以及存儲狀態。為了快速制作快照,您可以省略“推送”。在這種模式下,不允許使用非選項參數來防止拼寫錯誤的子命令產生不必要的隱藏項
git stash [save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [<message>]] //不建議使用此選項,而建議使用git stash push。它與“stash push”的不同之處在于它不能采用pathspec。而是將所有非選項參數串聯起來構成存儲消息。git stash show [<options>] [<stash>] // 顯示存儲項中記錄的更改,作為存儲項與首次創建存儲項時的提交之間的差異。默認情況下,該命令顯示diffstat,但是它將接受git diff已知的任何格式(例如,git stash show -p stash @ {1}以補丁程序形式查看第二最新的條目)。您可以使用stash.showStat和/或stash.showPatch配置變量來更改默認行為。git stash list [<options>] // 列出您當前擁有的存儲項。每個存儲條目均以其名稱列出(例如stash @ {0}是最新條目,stash @ {1}是之前的條目,依此類推),創建條目時當前分支的名稱以及一個條目所基于的提交的簡短描述。git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]pop:// 從存儲列表中刪除單個存儲狀態,并將其應用于當前工作樹狀態的頂部,即執行git stash push的逆操作。工作目錄必須與索引匹配。應用狀態可能會因沖突而失敗;在這種情況下,它不會從存儲列表中刪除。您需要手動解決沖突,然后手動調用git stash drop。apply:// 類似于pop,但不要從存儲列表中刪除狀態。與pop不同,<stash>可以是任何看起來像由stash push或stash create創建的提交的提交。
git stash apply stash@{0} // 在這個分支應用一個指定的存儲條目git stash drop [-q|--quiet] [<stash>] // 從存儲列表中刪除一個存儲。git stash branch <branchname> [<stash>] //從最初創建<stash>的提交開始創建并簽出名為<branchname>的新分支,并將記錄在<stash>中的更改應用于新的工作樹和索引。如果成功,并且<stash>是stash @ {<revision>}形式的引用,則它將刪除<stash>。
// 如果您在其上運行git stash push的分支已更改得足夠多,以至于git stash應用由于沖突而失敗,這將很有用。由于存儲條目是在運行git stash時是HEAD的提交之上應用的,因此它將恢復原始存儲狀態,而不會發生沖突。git stash clear // 刪除所有存儲條目。請注意,這些條目將隨后被修剪,并且可能無法恢復git stash create [<message>] // 創建一個存儲項(這是一個常規的提交對象)并返回其對象名稱,而不將其存儲在ref名稱空間中的任何位置。旨在對腳本有用。它可能不是您要使用的命令;請參閱上方的“push”。git stash store [-m|--message <message>] [-q|--quiet] <commit> // 將通過git stash create(這是一個懸空的合并提交)創建的給定stash 存儲在stash ref中,以更新stash reflog。旨在對腳本有用。它可能不是您要使用的命令;請參閱上方的“push”。
試驗功能分支(隨時有可能整個模塊二刪除的) git branch -D <name> // 丟棄一個沒有被合并過的分支用git branch -D <name>強行刪除
多人協作 // 把該分支上的所有本地提交推送到遠程庫,推送時要指定本地分支。// 這樣,Git就會把該分支推送到遠程庫對應的遠程分支上git push gitee master查看遠程庫信息,使用git remote -v;// 步驟1. 本地新建的分支如果不推送到遠程,對其他人就是不可見的;2. 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;//git pull origin master:brantest 將遠程主機origin的master分支拉取過來,與本地的brantest分支合并。// 冒號可以省略,本地分支不添加表示當前分支3. 在本地創建和遠程分支對應的分支,使用git checkout -b gitee/<branch> dev,本地和遠程分支的名稱最好一致;4. 建立本地分支和遠程分支的關聯,使用git branch --track gitee/<branch> dev是創建一個新分支,并關聯;git branch --set-upstream-to=gitee/<branch> dev 建立本地和遠程關聯5. 從遠程抓取分支,使用git pull,如果有沖突,要先處理沖突。
更新git全局配置方法 1.更新git全局配置信息,確保user/email信息正確;提供以下兩種方法更新配置:方法一:命令行直接更新已存在的配置git config --global --replace-all user.name "<ERP 或者 中文名>" git config --global --replace-all user.email "<京東郵箱>"方法二:直接更新本地 $HOME/.gitconfig 文件:[user]name = <ERP 或者 中文名>email = <京東郵箱>
2.更新完成后,查看配置信息確保準確無誤:git config --list使用git命令修改“commit message”同時重置當前Commit的user/email:$ git commit --amend --reset-author3.使用git log確認當前commit的Author信息已經重置
git cherry 默認比較HEAD本地分支和該分支追蹤的遠程分支
git cherry -v 展示帶有提交信息的差異git cherry -v organ/master [HEAD] 比較本地HEAD分支和遠程master分支之間的差別
git cherry -v master [HEAD] 比較本地HEAD分支和本地master分支的差別git cherry -v origin/master dev 比較本地dev和遠程master的差別
git cherry-pick 通常情況下,我們需要把一個分支的所有改動都合并到另一個分支,我們會用git merge
但是有時候我們想一個分支的部分提交合并到另一個分支,這時可以用git cherry-pick
git cherry-pick <commitHash> 將指定的提交也應用于當前分支
git cherry-pick <branch> 把該分支的最新一次提交也應用到當前分支
git cherry-pick <HashA> <HashB> 將A和B兩次提交應用到當前分支
git cherry-pick A..B 把A-B分支的所有提交(不包括A)都應用到當前分支,A分支必須早于B分支
git cherry-pick A^..B 把A-B分支所有的提交都應用到當前分支(包括A)A早于B
參數配置項
-e --edit 打開外部編輯器,編輯提交信息
-n --no-commit 只更新工作區和暫存區,不產生新的提交
-x 在提交信息里添加('cherry picked from commit 。。。'),方便以后查到這個提交如何產生的
-s --signoff 在提交信息里添加操作者簽名,表示誰進行的這個操作
-m parent-number --mainline parent-number
如果原始分支是一個合并節點,那么cherry-pick默認失敗,因為不知道具體采用哪個分支的變動
git cherry-pick -m 1 <commitHash>
采用提交<commitHash> 來之編號1的父分支的變動
通常合并節點中1號是接受變動的分支,2號是變動的來源分支
代碼沖突
如果代碼沖突,cherry-pick會停止下來,讓用戶決定如何繼續操作
git cherry-pick --continue
用戶解決完沖突 使用git add . 將文件改動加入暫存區,然后執行上面的命令讓cherry pick繼續執行
-- abort 發生沖突后,放棄合并,回到操作前的樣子
--quit 發生沖突后,推出cherry-pick操作,但是不回到操作前的樣子
轉移到另一個遠程代碼庫
// 添加一個遠程倉庫
git remote add originName git://gitUrl
// 將遠程代碼拉取到本地(因為cherry-pick只能挑本地有的commit)
git fetch originName
// 檢查要從遠程倉庫轉移的提交,獲取哈希
git log originName/branch
// 把指定提交應用到當前分支
git cherry-pick <commitHash>
歡迎指正交流,謝謝。
總結
以上是生活随笔 為你收集整理的git reset后本地拉取_Git学习笔记 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。