一、安裝
具體查看 安裝Git
windows下git bash坑
不能使用上/下鍵切換選項
參考:https://blog.csdn.net/csdn_yudong/article/details/86613435
推薦直接使用數字代替,從1開始
二、使用
基礎知識
- 工作區(Workspace):就是你在電腦里能看到的項目目錄。
- 暫存區(Index / Stage):臨時存放更改的地方,使用命令"git add <.|file>"就是把文件加入暫存區。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
- 版本庫(Repository):管理版本的文件,使用"git commit -m 'description'"就是把暫存區的文件提交到版本庫。工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
- 遠程倉庫(Remote):托管代碼的服務器。可以簡單的認為是你項目組中的一台電腦用於遠程數據交換
一張圖描述git的文件如何在各個區域之前流轉:
origin:遠程倉庫庫默認別名
本地項目初始化/和遠程倉庫操作
git init,把當前文件夾初 始化位git工程基本操作:添加/提交/查看記錄
git commit --amend -m "xxxx",修改上一次的提交信息
git cherry-pick <commitId>,復制一個特定的提交到當前分支,比如master分支的bug修復提交復制到dev分支
git cherry-pick commitId1..commitId100,復制兩個commit之間的提交到當前分支,注意:不包括commitId1
倉庫分支管理
例1. git遠程分支已經刪除,本地還能看到解決辦法
當我們刪除遠程分支后執行git branch -a本地卻依然能看到遠程分支
這個時候我們只需要執行git remote prune origin清理一下就可以了
然后再次執行git branch -a就看不到啦
代碼回退
看上面的幾個區域的圖基本就能明白
"git reset HEAD" 或者"git reset HEAD <file>"命令,暫存區的目錄樹或文件會被重寫,被 master 分支指向的目錄樹或文件所替換,但是工作區不受影響。
"git rm --cached <file>" 命令,會直接從暫存區刪除文件,工作區則不做出改變。
"git checkout ." 或者 "git checkout -- <file>" 命令,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。
"git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。
- git log a.js查看a.js的更改記錄
- git reset fcd2093 a.js 先將暫存區中的該文件回退到歷史版本fcd2093
- git checkout -- a.js 暫存區中該文件的歷史版本(fcd2093)覆蓋工作區中對應的文件,此時(工作區、暫存區的文件a.js是fcd2093版本)。
- git reset --hard aaaa 強制將版本庫回退到aaaa,但是遠程倉庫還是cccc
- git reset cccc 將head移到最新的版本(和遠程的head保持一致,實際就是將遠程暫存區的內容更新到最新版本cccc,工作區的內容還是保持在aaaa),此時aaaa和cccc的差異便作為本次更改的內容。
- git add / git commit / git push 提交后生成新的版本號dddd
此時git log 看到的最近的提交記錄就是:aaaa -> bbbb -> cccc -> dddd
【注】也可以使用git revert cccc 和 git revert bbbb來實現,不過會新增兩條回滾記錄
如果刪除遠程倉庫的最后一次提交的時候不需要保留歷史記錄的話,可以使用reset,命令如下:
git reset --hard HEAD^
git push origin master -f
保留半成品現場(存儲臨時現場)
子模塊
有時工程太過龐大想要分出子工程單獨管理,或者納入一個子工程到當前工程來,就可能用到子模塊功能。
$ git diff --cached subproject_demo diff --git a/subproject_demo b/subproject_demo new file mode 160000 index 0000000..aa1eeb0 --- /dev/null +++ b/subproject_demo @@ -0,0 +1 @@ +Subproject commit aa1eeb06e67608d7a2af179a7dfd9e594777e90f
chen_@DESKTOP-TJKEMKG MINGW64 /c/works/demo/subproject_demo ((aa1eeb0...)) // 發現沒:aa1eeb0就是之前的哪個提交
如果你在項目中改了子模塊的代碼,准備提交到對應的分支(add和commit已經執行過),使用:
git push origin HEAD:<branch> 這樣就把代碼提交到對應的分支 ,和 git push origin <localBranch> <remoteBranch>類似
【注】引入私有git工程還可以又其他方式,比如和npm配合:《2018 年了,你還是只會 npm install 嗎》查看“私有 git 共享 package”部分
打標簽
你可以使用 阿里的AoneFlow模式 使用Git做分支管理,每次發完版本之后需要給當前的master打一個tag,表示發布的一個版本,以便追溯。
git tag,展示所有已經打過的標簽
git tag -l 'v1.8.5*',匹配特定的標簽查看
git tag -a v1.4 -m "my version 1.4",打附注標簽
git tag -a v1.4 932cab, 后期給932cab提交補打上標簽
git tag v1.4-lw,打輕量標簽,沒有標簽信息
git tag -d v1.4,刪除表情按【謹慎】
git git push origin :refs/tags/v1.4,刪除遠程v1.4這個標簽
git show v1.4,命令可以看到標簽信息與對應的提交信息
git push origin v1.4,共享標簽,默認情況下,git push 命令並不會傳送標簽到遠程倉庫服務器上。 在創建完標簽后你必須顯式地推送標簽到共享服務器上
git push origin --tags,一次性把所有標簽push到遠程
【注】:更詳細查看https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE
https和ssh使用
查看鏈接:https://blog.csdn.net/qq_42108192/article/details/90168968
https模式下添加git賬號到項目,push不用每次輸入賬號密碼
打開.git文件的下的 vim .git/config新增以下內容
[user] name = XXXX05@qq.com email = XXXX05@qq.com [credential] helper=store
合並commit/修改歷史commit
合並commit用到git rebase,參考:https://www.cnblogs.com/laphome/p/11309834.html https://www.jianshu.com/p/964de879904a
需要注意的是,如果只是squash中間的部分節點。保存之后可能后面的pick執行會執行不了,提示如下
hint: Could not execute the todo command hint: hint: pick 4d45xxxx918364 xxxx hint: hint: It has been rescheduled; To edit the command before continuing, please hint: edit the todo list first: hint: hint: git rebase --edit-todo hint: git rebase --continue
明顯后面的pick沒有執行(導致漏掉),按提示先執行--edit-todo,然后--continue就OK
注意:然后要將修改過后的commit提交到遠程(在提交之前不要使用git pull。這回導致之前合並之前的commit記錄會被再次下載下來)。使用:git push -f 【需要特別注意,這個動作將不可回退,建議使用一個拷貝的分支來做這些動作】
修改歷史commit查看:https://blog.csdn.net/jbj6568839z/article/details/102797968
注意:為了確保edit后面的pick繼續執行,一定要執行“git rebase --continue” 。修改歷史commit這個操作會在一個副本上進行。完畢只有需要將記錄push到對應的分支上:
git push origin HEAD:<name-of-remote-branch> 如果失敗,加 -f 強制覆蓋(要特別小心,強制覆蓋會導致之前的記錄消失)
Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa'
https://www.jianshu.com/p/b6545f4cd317
- ssh-agent bash
- ssh-add ~/.ssh/id_rsa
更新一組依賴包
1.npm-check-updates
// 先下載 yarn global add npm-check-updates // 更新包(@kant @rousseau @alice)下的所有子包 ncu \"/@(kant|rousseau|alice)\\/\\S+/\" -u
2.upgrade-interactive
yarn upgrade-interactive --latest // 需要手動選擇升級的依賴包,按空格鍵選擇,a 鍵切換所有,i 鍵反選選擇
yarn upgrade package@version // yarn.lock和package.json都會更新,但是會進行版本鎖定 "echarts": "4.2.0-rc.2"
三、踩坑
[remote rejected] (hook declined)
完整日志:
$ git push Enumerating objects: 25, done. Counting objects: 100% (24/24), done. Delta compression using up to 8 threads Compressing objects: 100% (13/13), done. Writing objects: 100% (13/13), 1.20 KiB | 1.20 MiB/s, done. Total 13 (delta 11), reused 0 (delta 0) remote: git: 'refs/heads/web2.0' is not a git command. See 'git --help'. remote: error: hook declined to update refs/heads/web2.0 To https://e.coding.net/tops/front-www.git ! [remote rejected] web2.0 -> web2.0 (hook declined) error: failed to push some refs to 'https://e.coding.net/tops/front-www.git'
百度查看幫助,找到類似的問題:https://blog.csdn.net/weixin_39278265/article/details/102248258
本人的問題解決辦法
git config --global --unset branch.web2.0.merge
然后再push就OK
