git 常用操作

212 阅读9分钟

基本操作

  1. git init 初始化本地仓库
  2. git status git状态命令
  3. git add 文件名/. 把文件变化加入本地stage 也可以用 .是全部加入
  4. git rm --cached 文件名 把本地存在stage缓存区中的文件放回工作区

5. git log 查看日志。

  • git log -最近次数 可以查看最近的几次log。
  • git log --pretty = oneline 日志以单行显示核心内容。
  • git log --pretty=format:"%h %an %ar %s" 按照格式化来显示%h是头sha1值 %an作者 %ar提交时间 %s提交的message
  • git log --graph 图形化日志

6. git config 设置参数

  • git config --system (给git系统一次性设置 基本不用)
  • git config --global (给当前用户一次性设置)
  • git config --local (给当前项目一次性设置)

7.删除已提交的文件

git rm 文件名 ,文件将移动至缓存区,要彻底删除需要commit一次

8. 删除后悔

git rm 之后文件在缓存区

  1. 执行 git reset HEAD 文件名,删除操作转移到了工作区
  2. 执行git checkout -- 文件名 取消删除操作 9、重命名 git mv 原文件名A 新文件名B 文件重命名实际上是新产生一个文件并且把源文件删除,随意执行完后在缓存区有2个操作一个是A删除 一个操作是增加B。需要直接完毕需要再commit到仓库 如果这时候后悔 执行git reset HEAD A后再git checkout -- A 一下这时候A就回来了,但是B也还是存在 并且处于缓存区。如果想把B删除需要执行git reset HEAD B,在执行系统指令rm B删除工作区的B文件 10、注释重写 git commit --amend -m '新的注释' 修改最近一次提交的注释 11、gitignore 忽略文件 创建.gitignore文件并在里面写上需要忽略的名字
  • 通配符 * (所有) 比如*.jpg 忽略所有.jpg结尾的文件
  • !文件名(排除这些文件) 比如*.jpg !b.jpg 就是忽略所有jpg文件除了b.jpg
  • dir/ 忽略dir以及其文件夹下所有文件
  • dir/*.jpg 忽略dir文件夹下所有.jpg文件
  • dir/*/*.jpg 忽略dir文件夹内的任意文件夹内的.jpg 能忽略dir/abd/a.jpg 也能忽略dir/CDE/c.jpg 但是不能忽略dir/abc/ad/d.jpg、智能忽略任意1级子文件夹内的文件
  • dir/**/*.jpg 忽略dir文件夹内任意子文件夹下面的.jpg 子子孙孙都忽略

分支操作

1. git branch 查看分支

2. git branch 分支名 创建分支

3. git checkout 分支名 切换分支

4. git branch -d 分支名 删除分支(不能删除当前分支

其他不能删除的情况:包含“未合并”的内容(当且仅当待删除分支有某文件内容)如果需要强行删除则执行 git branch -D 分支名

5. git checkout -b 创建分支并切换到分支

6. git merge

git merge 分支名。合并分支 如果一个分支靠前(dev),一个分支落后(master),如果没有冲突,master可以通过merge 直接追赶上dev 这叫做fast forward。 fast forward:1、连个分支会归于一点commit,2、会丢失分支信息

  • git 在merge时候默认使用fast,也可以禁止fast forward。使用git merge --no-ff
  • git merge --no-ff :1、合并两个分支,并且不会归于一点commit(主动合并的分支往前一步)2、不丢失分支信息,分支信息完整 -- 当两个分支都有修改内容时候合并会发生冲突,发生冲突需要解决冲突,vi修改对应冲突文件,再进行git add(这是add不是从工作区保存到暂存区,而且告知系统冲突解决),最后再git commit
<<<<<<<<HEAD  //这里是当前HEAD冲突文件的冲突部分内容
aaaa  //冲突内容
==========  //分隔符
>>>>>>>dev //分支和当前HEAD有冲突的部分
bbbb  //冲突内容
cccc
dddd
//解决完冲突后是以下内容(假设保留当前分支的修改)
aaa
ccc
ddd

注意当master在merge时遇到冲突,并解决则解决冲突会进行2次提交:1次是最终提交,1次是将对方分支的提交信息也拿来了。

7.版本穿梭

回退到上一次: git reset --hard HEAD^ 回退到前N次: git reset --hard HEAD~N 跳转到某一次:git reset --hard sha1值 可以结合git reflog (查看git 所有的日志。)

8.cheout放弃与游离

checkout 文件名 :放弃修改。放弃的是工作区的内容,放弃相对于暂存区和对象区的 checkout:版本穿梭(游离状态)

  1. 修改必须提交;
  2. 现在是创建分支的好时机 git branch 分支名 穿梭到的sha1值

9. 分支重命名

git branch -m 分支名 新分支名

10.stash 保存现场

  • 建议(规范):在功能未开发完全之前不要commit
  • 必须(规定):在没有commit之前,不才能checkout切换分支(不在同一个commit阶段)
    如果某个功能还未开发完毕就要切换分支:建议1.保存现场,再切换分支
  1. 保存现场:git stash
    git stash save 名字(保存带名字的现场)
  2. 查看现场:git stash list
  3. 还原现场:git stash pop (将原来保存的现场删除,并把它还原进工作区,默认还原最近一次)
    git stash apply(还原并不删除保存的现场) git stash drop 现场的索引名(手工删除现场,删除最近一次不需要加上索引名)

11.tag 标签

标签适用于整个项目和分支无关

  • 创建标签
    git tag 标签名 ,比如git tag v1.0:创建一个简单标签仅包含sha1值
    git tag -a 标签名 -m '内容',比如git tag -a v2.0 -m '这是第二个版本
       创建一个带信息的标签;创建标签v2.0其标签内容是这是第二个版本
       这种方式创建的标签不仅包含当前commit的sha1还有自身的sha1和标签信息
  • 查看标签
    git tag 或者git tag -l
  • 推送标签到远程
    git push origin 标签名:单个标签推送到服务器
    git push origin --tags:将本所有标签推到服务器
    git push -f origin 标签名:强推标签到远程 如果远程原来有这个版本需要替换的话用这个
  • 删除标签
    删除本地标签:git tag -d 标签名
    删除服务器标签:
     1、git push origin :refs/tags/标签名
     2、git push origin --delete tag 标签名,这个方法需要先删除本地的标签
  • 显示标签信息
    git show 标签名
  • 拉取远程标签
    git pull :拉取标签可以感知新增标签,但是无法感知远程被删除的标签

12.blame 责任

git blame 文件名 查看文件所有提交commit sha1值以及每一个作者。用于追责

13. diff

  1. diff a文件 b文件 :比较ab两个文件差异,比较文件差异(linux命令)
  2. diff -u a b 比较源文件a和被比较文件b之间差异.---表示源文件 +++表示被比较的文件
$ diff -u a.txt b.txt
--- a.txt       2021-07-19 09:10:50.054824100 +0800
+++ b.txt       2021-07-19 15:18:28.143071900 +0800
@@ -1 +1,2 @@
-aaa
+aa
+bb
  1. git diff :比较的是暂存区和工作区的差异
  2. git diff commit的sha1值 :比较对象区与工作区的差异
  3. git diff --cached commit的sha1值:比较对象区与暂存区之间的差异

14. github

  • ssh配置。远程放公钥,本地放私钥
    ssh-keygen 生成秘钥
  • git remote add origin 远程地址 :给本地仓库添加远程仓库,并且给别名origin
  • git push -u origin master :把本地master推送到远程origin 并且两者绑定后续只需要git push就可以
  • git remote show 查看远程分支
  • git remote show origin(分支别名) 查看具体的某个远程分支的情况 git 会在本地维护ogirin/master分支,通过该分支感知远程gitbub的内容

15. git一般流程

  • dev:开发分支,频繁变化
  • test:基本开发完毕后,交给测试实施人员的分支
  • master:生产阶段,很少变化 bugfix:临时修复bug的分支 dev->test(test merge dev)->master(master merge dev)

16. 远程本地关联操作

  • 查看远程分支 git log origin/master
  • 查看本地分支情况 git branch -av
  • 本地-》远程:git push
    如果有本地有新分支dev远程没有推送方法有2个:
     1、git push -u origin dev;
     2、git push --set-upstream origin dev
  • 远程-》本地:git pull
     如果远程有其他分支dev,本地方库没有这个仓库操作如下:
    远程-》追踪:git pull;
    追踪-》有2个方法:
     方法1 git checkout -b dev origin/dev;
     方法2 git checkout --track orign/dev;
  • 删除分支:git branch -d 分支名
    删除远程分支:git push origin :dev(分支名) 或者 git push origin --delete dev(分支名)
  • git push origin src:目标分支 方法扩展
     git push origin dev:dev2 方法等价于将本地dev推送并关联到远程的dev2
     git push origin HEAD:dev2 方法等价将当前HEAD指向分支推送并关联到远程dev2
  • git pull origin src:目标分支 方法扩展,src是也是分支名
    git pull origin dev:test 把远程dev拉到本地并创建关联本地的test分支,此方法等同于 git pull + git checkout -b test origin/test
  • 清理无效的 追踪分支(本地感知的远程分支)
    远程已经删除了分支a,但本地却感知远端的分支a
    监测:git remote prune origin --dry-run
    删除这个感知分支a git remote prune origin

17. 给命令取别名

git config --global alias.ch checkout 相当于给checkout 取别名ch ,以后命令行输入ch=checkout

18. submodule 子模块

  • 添加子模块:git submodule add 子模块仓库地址;
  • 更新子模块,有2种方法:
    1. git submodule foreach git pull:在a仓库内执行此命令作用是把a项目的所有子模块都pull更新;
    2. 进入子模块,在子模块下执行git指令 git pull 更新模块;
  • 克隆带有子模块的项目:git clone 远程仓库地址 --recursive

19.cherry-pick
将commit转移(复制)至其他分支,每次只能转移(复制)一个commit

  • git cherry-pick sha1值;需要先切换到需要转移至的目标分支再操作
  • cherry-pick 在转移复制的时候不要夸commit,逐个顺序转移;

20.git rebase 变基

rebase 会改变提交历史
rebase 之后线路是一条线
rebase 之后有冲突 : a.解决冲突。需要 vi修改 add添加  再执行git rebase --continue
                   b.忽略冲突。(放弃rebase所在分支的修改,直接使用其他分支的内容, git rebase --skip
终止rebase,还原成rebase之前的场景:git rebase --abort
建议:rebase分支只在本机操作,不要推送远端。尽量不要在master执行rebase