实习中整理的常用的 git 指令,分支管理,撤销回滚,以及常见的问题解决

开发中常用的 git 指令,以及常见的问题Q&A

文章目录

  • 开发中常用的 `git` 指令,以及常见的问题Q&A
  • git 常用指令
    • 基本用法
  • Git 分支管理
    • `git stash`
  • Git 撤销与回滚
  • 开发中遇到的问题
    • 代码冲突
      • 解决方法:
    • 修改 `commit` 信息
      • 解决方法 :
    • 合并多余的提交记录
      • 解决方法:
    • 对于合并的理解

git 常用指令

  • git init 这个目录变成Git可以管理的仓库
  • git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改
  • git remote add origin ***.git 添加远程仓库地址
  • git remote rm origin 删除添加的远程地址
  • git pull 命令用于从远程获取代码并合并本地的版本

基本用法:

git pull <远程主机名> <远程分支名>:<本地分支名>

例如执行下面语句:

git pull origin master:brantest

将远程主机origin的master分支拉取过来,与本地的brantest分支合并。

如果远程分支是与当前分支合并,则冒号后面的部分可以省略:

git pull origin master
  • git branch 可以查看本地的所以分支

  • git branch -d dev 可以删除本地的dev分支(注意要切换到其他分支后再删除)

  • git checkout dev 可以切换到指定dev分支,-b选项可以创建并切换到指定dev分支

  • git push -u origin dev 命令将本地的dev分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了

    • -u选项会指定一个默认主机,这样后面就可以不加任何参数使用git push
  • git push origin 将当前分支推送到origin主机的对应分支

  • git push origin --delete

基本用法

暂存区git add之后commit之前存在的区域;工作区git commit之后存在的区域;远程仓库git push之后;

  • 拉取项目代码

拉取项目代码(最便捷的直接通过 clone

新建一个空文件夹(注意:文件夹需命名为英文,否则可能会出错)

git clone '复制项目上的链接' (最好通过SSH拉取代码)

此时就会在当前文件夹内出现该项目文件,然后 cd 进去执行其他操作即可

第二种,创建 git 仓库后拉取代码(或者通过download项目压缩文件)

第一步,初始化 git 仓库

git init

第二步,添加远程仓库地址

git remote add origin [email protected]:SS/SOC/soc_workflow_webui.git

第三步,拉取仓库代码

 git pull origin master 

此时的效果与 git clone 一致

  • 个人分支开发

第一步,基于当前小队分支下,创建并切换到个人分支(注意:分支命名一般以姓名缩写拼接小队分支)

git checkout -b hwc_team_dev(个人姓名加小队分支)

可能有些分支是以 ci 结尾的如 team_dev_ci ,注意创建个人分支时请将 _ci 给去掉,因为有些仓库对于 ci 结尾的分支做了保护,会导致代码推送不成功

第二步,查看是否切换到了自己的分支

git branch

第三步,查看当前文件的状态

git status

第四步,可以将修改的文件加入到暂存区

git add . (将所有修改的文件都加入暂存区)
git add <file> 将指定文件加入到暂存区

第五步,将暂存区的内容添加到本地仓库

`git commit -m "message"`  

commit 内容规范

  • feat: 一个新特性
  • fix: 一次 bug 修复
  • update: 既不属于新特性又不是 bug 修改的代码修改
  • docs: 只是对文档进行修改
  • style: 不影响代码本身含义的代码风格修改 (white-space, formatting, missing semi-colons, etc)
  • perf: 性能优化
  • test: 添加或修改测试用例
  • build: 修改构建工具 (example scopes: gulp, broccoli, npm)
  • ci: 修改自动化脚本 (example scopes: Circle, BrowserStack, SauceLabs)
  • revert: 回滚提交
  • WIP: 功能还在开发中,表示其还未准备好可以接受合并

第六步,将本地的分支版本上传到远程并合并

git push -u origin dev(个人分支)

第一次通过 -u 设定了 origin 为默认主机后,后面只需通过 git push 即可将本地分支推送到远程

注意

如果没指定远程主机,直接 git push 命令行会告诉你通过 git push --set-upstream origin dev 来强制绑定远程分支为默认分支推送,

后续 git push 也可以不用指定主机

Git 分支管理

  • 创建分支: git branch test
  • 切换分支: git checkout test
  • 创建并切换分支:git checkout -b test
  • 将master分支的更改合并到test分支:先在master分支上pull,再:git checkout test; git merge master
  • 如果合并时产生冲突:先手动解决冲突,再合并
  • 删除分支:git branch -d test
  • 如果在其它分支上做了一个修改(比如修复了一个bug,这次修改有一个commitID),想要将这次修改应用到当前分支上,可以使用:git cherry-pick commitID,可以复制一个特定的提交到当前分支

git stash

  • 如果当前分支还有任务没有做完,也不想提交,但此时需要切换或者创建其它分支,就可以使用git stash将当前分支的所有修改(包括暂存区)先储藏起来;然后就可以切换到其它分支

原理:
将本地没提交的内容( git commit 的内容不会被缓存 但 git add 的内容会被缓存)进行缓存并从当前分支移除,缓存的数据结构为堆栈,先进后出

  • 在其它分支工作完成之后,首先切换回原来的分支,然后使用git stash list命令查看

  • 可以使用git stash apply 恢复之前储藏的工作现场,再使用git stash drop 删除掉储藏的内容

  • 也可以直接用git stash pop恢复并删除内容

  • 具体指令

1、保存当前分支修改(若未指定提交信息,而这条缓存名称为最新一次提交的commit -m的内容,如果没有本地提交则是拉远程仓库是的commit内容)

git stash
解释:会把所有未提交的修改(包括暂存的和非暂存的)都保存起来
git stash save "messeag"
解释:会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,并增加说明
git stash save -u "messeag"
解释:会把所有未提交的修改(包括1.暂存的;2.非暂存的;3.新加入的代码文件:untracked files)都保存起来,并增加说明

2、stash指定的文件

1.多个文件
git stash push <file1> <file2> <file3> [file4 ...]
2.单个文件
git stash push -m "message" <file>
解释:指定单文件缓存,并增加说明

3、查看stash

git stash list
解释:在使用git stash apply命令时可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0}

4、查看指定stash的diff

git stash show stash@{number}
解释:查看指定stash的diff,后面可以跟着指定那个stash,默认使用最近的stash(即stash@{0}git stash show -p stash@{number}
解释:在该命令后面添加-p或--patch可以查看特定stash的全部diff

5、重新应用缓存的stash

git stash pop
解释:这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下
git stash apply
解释:将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝

6、移除

git stash drop stash@{0}
解释:删除指定的stash
git stash clear
解释:删除所有缓存的stash

Git 撤销与回滚

  • 暂存区git add之后commit之前存在的区域;工作区git commit之后存在的区域;远程仓库git push之后;
  • 作了修改,但还没git add,撤销直接文件的更改
git checkout <fileName>
撤销并切换到指定文件
git checkout -f <fileName>
  • 作了修改,并且已经 git add,但还没 git commit

    • 先将暂存区的修改撤销:git reset HEAD filename/git reset HEAD;此时修改只存在于工作区,变为了 “unstaged changes”;
    • 再利用上面的checkout命令从工作区撤销修改
  • 作了修改,并且已经 git commit了,想撤销这次的修改:

    • git revert commitID. 其实,git revert可以用来撤销任意一次的修改,不一定要是最近一次
    • git reset --hard commitID/git reset --hard HEAD^(HEAD表示当前版本,几个^表示倒数第几个版本,倒数第100个版本可以用HEAD~100);
      • 参数--hard:强制将暂存区和工作区都同步到指定的版本
    • git resetgit revert的区别是:reset是用来回滚的,将HEAD的指针指向了想要回滚的版本,作为最新的版本,而后面的版本也都没有了;而revert只是用来撤销某一次更改,对之后的更改并没有影响
    • 然后再用git push -f提交到远程仓库

开发中遇到的问题

代码冲突

  • 当开发过程中由于没有及时拉最新代码,或者开发中有最新代码更新,且当前分支代码的改动与主分支的代码改动在同一个地方时,就会报代码冲突,需要先合并后再提交

解决方法:

先在本地主分支拉最新的代码然后再合并到个人分支,解决掉冲突后再提交

第一步,git checkout 主分支 切换到主分支

第二步,git pull 拉取远程主分支最新代码到本地合并

第三步,git checkout 个人分支 切换回个人分支

第四步,git merge 主分支--no-ff 参数 :意为强行关掉fast-forward,在使用这种方式后,分支合并后会生成一个新的 commit

随后解决掉冲突的内容后,再提交代码即可

修改 commit 信息

开发中,由于没习惯按规范提交的 commit,每次不小心提交后才意识到注释写错了

解决方法 :

通过 git commit --amend 进入git操作面板

最上方的就是 上次commit 的信息

insert 进行插入,将信息更改为符合规范的信息后,按 Esc 退出,然后键入 :wq 保存退出

然后再通过 git log 查看最近的提交记录

可以看到,最近的 commit 信息已经更改

若是相同步远程分支,则再通过 git push -f 强制同步本地信息即可

合并多余的提交记录

开发过程中,频繁更改代码,然后更改一次就提交一次,造成了很多提交记录(这里推荐小幅度更改使用,--amend --no-edit没有提交记录)

但是我只想保留一个提交记录,那就可以使用 git rebase 合并多余的提交记录

解决方法:

第一步,git rebase -i HEAD~(n) / git reabse -i commitID n代表你要向前合并多少次提交,或者指定要合并到 commitID

这里要合并最后三个

git rebase -i HEAD~3

选择 pick 操作,git会应用这个commit,以同样的提交信息(commit message)保存提交
选择 reword 操作,git会应用这个commit,但需要重新编辑提交信息
选择 edit 操作,git会应用这个commit,但会因为amending而终止
选择 squash 操作,git会应用这个commit,但会与之前的提交合并
选择 fixup 操作,git会应用这个commit,但会丢掉提交日志
选择 exec 操作,git会在shell中运行这个命令
选择 drop 操作,git会移除此次提交
一般选择 p/s,在此处需要保留第一个提交信息,所以第一个为 p ,剩下两个为 s

然后按 Esc ,键入 :wq 保存退出

然后此时会弹出另一个 git操作框,将你不需要保留的 commit 信息在前面加上 # 即可

然后保存退出,此时再查看提交信息,就剩下一个啦

备注

若有冲突,则解决完冲突,git add .

然后再,git rebase --continue

若是出错, 则可以通过 git rebase --abort 取消合并重新操作

最后可以 git push -f 同步到远程仓库

对于合并的理解

最新的一次提交是解决了代码冲突后的合并提交信息,但是我想将后三个提交的信息给整成一个提交,我尝试使用了 git rebase -i HEAD~3

会发现合并的信息并不会显示,当时找了很多办法也没有解决,所以对于此我的理解为,合并把主分支的指针指向了当前指针,该合并产生的更改信息是不可合并到其他提交里

你可能感兴趣的:(git版本控制,git,github,ssh)