|
| 1 | +## 廖雪峰—Git |
| 2 | + |
| 3 | +#### 创建版本库 |
| 4 | + |
| 5 | +1.创建空目录 mkdir cd pwd |
| 6 | +2.将目录变成Git可管理仓库 git init ls -ah |
| 7 | + |
| 8 | +#### 文件添加版本库 |
| 9 | + |
| 10 | +1.文件添加到仓库 git add xxx |
| 11 | +2.文件提交到仓库 git commit -m "xxx" git commit -a --allow-empty-message -m "" |
| 12 | + |
| 13 | +#### 更改文件与提交 |
| 14 | + |
| 15 | +1.更改文件 |
| 16 | +2.查看更改 查看状态git status 对比git diff xxx |
| 17 | +3.提交更改 ①git add xxx 看状态(将要提交的修改)git status ②提交git commit -m "xxx" (看状态) |
| 18 | +看历史记录 git log git log --pretty==oneline |
| 19 | + |
| 20 | +#### 版本回退 |
| 21 | + |
| 22 | +Head 当前版本 Head^上一版 Head^^上上一版本 HEAD~100 |
| 23 | +1.退回上一版本 git reset --hard HEAD^ |
| 24 | +     查看版本库状态(历史提交版本) git log --pretty=oneline [已无最新的版本] |
| 25 | +     显示文档 cat xxx |
| 26 | +2.返回上一版(重返未来) git reset --hard xxx(commit_id) |
| 27 | +     若clear了看不到新id(查看命令历史) git **reflog** |
| 28 | + |
| 29 | +#### 工作区和暂存区 |
| 30 | + |
| 31 | +工作区—— 文件夹(电脑可看目录) |
| 32 | +版本库—— .git |
| 33 | +git add 文件由**工作区**添加到**暂存区**,即stage(index);git commit将**暂存区**内容提交到**分支**(仓库) |
| 34 | +需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。 |
| 35 | +对比: |
| 36 | +git diff xxx 比较的是**工作区**文件与**暂存区**文件的区别 |
| 37 | +git diff --cached xxx **暂存区**和HEAD(**仓库**)的不同 |
| 38 | +git diff HEAD --xxx 查看**工作区**和**仓库**(版本库**最新版本**)的差异 |
| 39 | +git checkout xxx 把**暂存区**最新版本转移到**工作区**(撤销工作区修改) git add的反向命令 |
| 40 | +git reset HEAD xxx 把**仓库**最新版本转移到**暂存区** git commit反向命令 |
| 41 | + |
| 42 | +Git跟踪修改:每次修改,如果不用git add到暂存区,那就不会加入到commit中。 |
| 43 | + |
| 44 | +#### 撤销修改 |
| 45 | + |
| 46 | +1.丢弃**工作区**的修改 git checkout -- xxx |
| 47 | +     1.修改后还没有被放到暂存区,撤销回到和版本库一模一样的状态 |
| 48 | +     2.已经添加到暂存区,撤销回到添加到**暂存区**后的状态 |
| 49 | +即,让这个文件回到最近一次 git commit 或 git add 时的状态。 |
| 50 | +2.丢弃**暂存区**的修改 |
| 51 | +     1.git reset HEAD xxx (把暂存区的修改撤销(unstage),重新放回**工作区**) |
| 52 | +     2.git checkout -- xxx 丢弃工作区修改 |
| 53 | +3.丢弃**版本库**的修改 即版本回退 |
| 54 | + |
| 55 | +#### 删除文件 |
| 56 | + |
| 57 | +1.删除目标文件 手动 / rm命令 |
| 58 | +     工作区和版本库不一致 通过git status可以查看哪些文件被删除 |
| 59 | +2.两种情况: |
| 60 | +     1.从版本库中删除该文件 ①git rm xxx ②git commit -m "xxx" |
| 61 | +     2.误删,需要恢复(到版本库最新版本) git checkout -- xxx [用版本库里的版本替换工作区的版本,不论工作区修改/删除,皆还原] |
| 62 | +     注:如果从版本库中删除了文件又想恢复,可以用版本回退。 |
| 63 | + |
| 64 | +#### 远程仓库 |
| 65 | + |
| 66 | +1.通过SSH连接远程仓库 在主目录 ssh-keygen -t rsa -C " [email protected]" |
| 67 | +     有 id_rsa 和 id_rsa.pub 这两个文件 |
| 68 | +2.登陆Github-SSH Keys 粘贴 id_rsa.pub 内容(公钥) |
| 69 | + |
| 70 | +###### 添加远程库 |
| 71 | + |
| 72 | +1.github-create a new repo-输入name,create。成功创建一个新的Git仓库(空的)。 |
| 73 | +2.**关联远程库** git remote add **origin** https://github.com/XiaochengYe/learngit.git |
| 74 | +3.本地库内容**推送** git push -u origin master (远程仓库不为空,不用-u) |
| 75 | +     1.若报错OpenSSL SSL_read: Connection was reset, errno 10054 |
| 76 | +     解决方法:查询下面三个域名ip:github.com、github.global.ssl.fastly.net、codeload.Github.com。找到hosts文件,将上述三行(带ip)放在末尾,保存。https://blog.csdn.net/qq_29493173/article/details/113092656 |
| 77 | +     也可以解除SSL验证 git config --global http.sslVerify "false" |
| 78 | +     2.若报错failed to push some refs to https://github.com/XiaochengYe/learngit.git |
| 79 | +     解决方法:新创建的那个仓库里面的README文件不在本地仓库目录中,这时可以同步内容。git pull --rebase origin master 再 push。 |
| 80 | +     3。若验证连接ssh -T [email protected]提示输入 输入yes |
| 81 | +之后,只要本地做了提交。git push origin master 即可将本地master分支**最新修改**推送至Github。 |
| 82 | + |
| 83 | +###### 删除远程库 |
| 84 | + |
| 85 | +1.先用 git remote -v 查看远程库信息。 |
| 86 | +2.根据名字删除 git remote rm xxx |
| 87 | +“删除”其实是**解除**了本地和远程的绑定关系,并不是物理上删除了远程库。 |
| 88 | + |
| 89 | +###### 从远程库克隆 |
| 90 | + |
| 91 | +git clone [email protected]:michaelliao/gitskills.git 或 git clone https://github.com/XiaochengYe/gitskills |
| 92 | +(前者Git用ssh协议会更好) |
| 93 | + |
| 94 | +#### 分支管理 |
| 95 | + |
| 96 | +###### 创建与合并分支 |
| 97 | + |
| 98 | + |
| 99 | +1.**创建并切换**dev分支 git checkout -b dev |
| 100 | +         即:**创建分支**git branch dev; **切换分支**git checkout dev |
| 101 | +     **查看当前分支** git branch |
| 102 | +2.git add和commit修改 |
| 103 | +3.分支工作完成切换回master分支 |
| 104 | +     法一:git checkout master |
| 105 | +     法二:**创建并切换**到dev分支git switch -c dev **切换**已有分支 git switch master[同1] |
| 106 | +4.将dev分支的工作成果**合并到当前**(master)分支 git merge dev |
| 107 | +5.**删除**dev分支 git branch -d dev |
| 108 | +     git branch 查看,只有master |
| 109 | + |
| 110 | +###### 解决冲突 |
| 111 | + |
| 112 | +1.新分支 git switch -c feature1 |
| 113 | +     修改readme.txt 在feature1分支上提交(add commit) |
| 114 | +2.切换 master git switch master |
| 115 | +     修改readme.txt 在master分支上提交(add commit) |
| 116 | +3.合并 git merge feature1 |
| 117 | +     冲突!git status查看,cat xxx查看readme.txt的内容。 |
| 118 | +     修改文件,再提交。(add commit) |
| 119 | +4.查看分支合并情况 **git log --graph** --pretty=oneline --abbrev-commit |
| 120 | +5.删除feature1分支 git branch -d feature1 |
| 121 | +**小结**:当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。 |
| 122 | + |
| 123 | +###### 分支管理策略 |
| 124 | + |
| 125 | +合并分支时,加上`--no-ff`参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而`fast forward`合并就看不出来曾经做过合并。 |
| 126 | + |
| 127 | +1.创建并切换dev分支 git switch -c dev |
| 128 | +2.修改readme.txt文件,提交。 |
| 129 | +3.切换回master git switch master |
| 130 | +4.合并dev分支 git merge --no-ff -m "merge with no-ff" dev (禁用Fast forward) |
| 131 | +     本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。 |
| 132 | +5.查看分支历史 git log --graph --pretty=oneline --abbrev-commit |
| 133 | +     不使用Fast forward模式。可以看到dev分支。 |
| 134 | + |
| 135 | +###### bug分支 |
| 136 | + |
| 137 | +1.查看工作区 git status (有未提交内容) |
| 138 | +2.储藏工作现场 git stash |
| 139 | +     git status,工作区干净状态。 |
| 140 | +3.在master分支修复bug,创建临时分支。 |
| 141 | +     git checkout master |
| 142 | +     git checkout -b issue-101 |
| 143 | +     提交add、commit。 |
| 144 | +4.修复完成,切回master,并完成合并,删除issue-101分支。 |
| 145 | +     git switch master |
| 146 | +     git merge --no-ff -m "merged bug fix 101" issue-101 |
| 147 | +     git branch -d issue-101 |
| 148 | +5.回dev干活。恢复工作区 |
| 149 | +     1.git switch dev |
| 150 | +     2.git status查看,工作区是干净的。 |
| 151 | +     3.git stash list查看列表,恢复。 |
| 152 | +         1.git stash apply stash内容并不删除 git stash drop删除 |
| 153 | +         2.git stash pop 把stash内容也删 |
| 154 | +**小结**: |
| 155 | +1.修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。 |
| 156 | +2.当手头工作没有完成时,先把工作现场 `git stash` 一下,然后去修复bug,修复后,再`git stash pop`,回到工作现场。 |
| 157 | +3.在master分支上修复的bug,想要合并到当前dev分支,可以用`git cherry-pick <commit>`命令,把bug提交的修改“复制”到当前分支,避免重复劳动。 |
| 158 | + |
| 159 | +###### Feature分支 |
| 160 | +开发一个新 feature,最好新建一个分支。 |
| 161 | +如果要丢弃一个没有被合并过的分支,可以通过 git branch **-D** <name> 强行删除。 |
| 162 | + |
| 163 | +###### 多人协作 |
| 164 | + |
| 165 | + |
| 166 | + |
| 167 | + |
| 168 | + |
| 169 | + |
| 170 | + |
| 171 | + |
| 172 | + |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | + |
| 179 | + |
| 180 | + |
| 181 | + |
| 182 | + |
| 183 | + |
0 commit comments