git 常见操作总结

git(分布式管理系统)

git本地操作

  1. git config
    git config --global user.name "Your Name"
    git config --global user.email "[email protected]"

  2. git log
    git log --oneline oneline为--pretty=oneline --abbrev-commit简写
    git log -p 查看提交记录,并且展示具体修改
    git log --author=< somebody > --grep fix 过滤查看某人的某次提交工作内容(commit message)

  3. git reflog
    git reflog --oneline 列出所有操作记录,包括提交、切换分之、合并分之等

  4. git reset --hard [HEAD | commitId] (HEAD指当前版本)
    git reset --hard HEAD^ 回退到上次提交版本
    git reset --hard HEAD^^ 回退到上上次提交版本
    .....
    git reset --hard HEAD~10 回退到十次提交以前
    git reset --hard e8f8gd 回退到e8f8gd 这一次
    git reset -–hard origin/master 回退到与远程master代码一样

    git reset --soft HEAD^ 回退到上次暂存区状态
    git reset --mixed HEAD^ 回退到上次工作区状态
    以此类推....

  5. git diff 比较的是工作区和暂存区的差别
    git diff --cached 比较的是暂存区和版本库的差别
    git diff HEAD 可以查看工作区和版本库的差别
    git diff 分支1名 分支2名 文件名 分之可以为本地分之,也可以为远程分之

  6. git checkout -- readme.txt 丢弃工作区的修改

    • 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    • 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
    • 总之,就是让这个文件回到最近一次git commit或git add时的状态。
  7. git reset HEAD 回退暂存区到工作区的修改,再执行git checkout -- 将会回退到上一次提交时的版本

  8. git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

  9. git rm readme.txt rm 参数为 add 取反删除

  10. git rm -r --cached 文件/文件夹 名字有不该提交的文件已经提交后,仅仅在.gitignore中加入忽略是不行的,执行该命令再重新 git add. git commit即可

  11. git clone < [email protected]:xxx/xxxx.git >

git 分之操作管理

  1. git checkout -b dev 新建一条dev分之,并切换(-b)到dev分之
    git checkout -b dev = git branch dev + git checkout dev
    git checkout -b 本地分支名 origin/远程分支名 从远程拉取一条本地不存在的分之并切换到上面

  2. git branch 查看当前本地所有分支
    git branch --merged 查看已经合并到当前分之的分支 --no-merged 没有合并过的分支
    git branch -d dev 删除dev分之
    git branch -D dev 强制删除没有合并过的dev分之
    git branch --set-upstream-to=origin/dev dev 将远程dev分之与本地dev 分之关联起来。下次直接git pull 或者 git push 就可以了,不用带远程分之名称
    git branch | grep -v "master" | xargs git branch -D 将除master以外所有本地分支删除
    git branch -r | grep -v "master" | xargs git branch -D -r 将除master以外所有远程关联分支删除

  3. git merge dev 将dev分之修改内容合并到当前分之上

  4. git rebase 变基操作
    下面用例子来区分rebase与merge区别:

    • 假设有master分之, 我们在master提交一次C1。
    • 然后检出分之dev 提交两次C2
    • 然后切换分之到master,然后提交一次C3并且C3与C2修改了同一行代码,造成冲突
    • 然后再在master 上提交一次C4
    • 然后切换到dev 上提交一次C5
    • 这时切换到master上合并dev git merge dev 生成的提交线为 C1 > C2 > C3 > C4 > C5 > C6,这是按照提交事件来进行合并,C6 为你解决了C2与C4造成冲突的新修改
      但是, 用rebase就得到的不一样结果,
    • 假设现在没做上次 merge 操作,
    • 然后git rebase master,这时候 git提示出现了代码冲突,此处为之前埋下的冲突点,处理完毕后 git add . ( 添加冲突处理后的文件),
    • git rebase --continue (加上--continue参数让rebase继续处理),
    • 然后git checkout mastergit merge dev
    • 这时候master处理完的提交线为 C1>C3>C4>C2>C5, 能够看出dev是变基线为master最新一次提交,然后再合并dev两次提交。
      注意
  5. git stash // 暂存工作区
    git stash apply <暂存记录,不写默认最近一次>将暂存区内容恢复到工作分之
    git stash list 查看多次暂存记录
    git stash drop stash@{0} 将stash@{0}次暂存删除
    git stash pop <暂存记录,不写默认最近一次> 将暂存区内容恢复到工作分之并删除暂存
    git stash branch 将暂存内容恢复到一个新分支上

  6. 分支策略

    • 在实际开发中,我们应该按照几个基本原则进行分支管理:
    • 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    • 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    • 每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
    • 如果有bug需要修复,则切换到需要修复分之,然后检出新分支比如 bugfix 分之进行修复部署
    • master release hotfix develop feature 分之个人理解
  7. 多人协作

    • 多人协作的工作模式通常是这样:
    • 首先,可以试图用git push origin < branch-name >推送自己的修改;
    • 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    • 如果合并有冲突,则解决冲突,并在本地提交;
    • 没有冲突或者解决掉冲突后,再用git push origin < branch-name >推送就能成功!
    • 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令**git branch --set-upstream-to=origin/< branch-name > < branch-name > **。
  8. 常常令人窒息的操作

    • git cherry-pick选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit)
      • 比如B分之想合并A分之的某一次commit
      • 首先git log 找到A上面提交的commitId记录下来,然后git checkout b,
      • 然后git cherry-pick commitId or git cherry-pick commitId1..commitId100(不包含开始的第一个commitID1,包含最后commitId100)
    • git rebase -i < commitId > 弹出某次commitId 到至今的提交记录
      • 上面操作会打开提交记录
        pick 4968689 添加了一个文件A
        pick 7a1d0c0 添加了一个文件B
      • 如果想删除 添加了一个文件A 这次提交,则将最前面pick 改为drop,然后wq退出,则删除
      • 如果想同步到远程仓库 git push -f (再次提醒该命令慎用!!)
    • git revert 不一样的版本回退
      • 首先找到想回退的版本ID git log

      • git revert < commitId >

      • 会生成一次新的提交,文件内容将删除commitId这一次的提交

      • git revert -n commitID1..commitIDN 回退这两次版本之间的版本(不包含commitID1, 包含commitIDN),但是不会生成一次新的commit,需要手动add,commit

    • git fork
      • git fork 不是一个命令
      • fork 是在远程拉取一个与原代码库(A)一模一样的一个自己的库(B)。
      • 要想同步原代码库(A)到本地代码(C),则先绑定主机到本地
      • git remote add upstream https://github.com/原代码库/xxx.git
      • git remote add origin [email protected]:my/xxxx.git
      • 绑定完git fetch upstream 拉取原代码库(A)的代码
      • git merge upstream/master 将master分之代码同步到本地,然后可以进行修改
      • git push origin master 推到自己的代码库,之后再可以发起merge requset到原代码库

git tag

  1. git tag 查看所有tag
  2. git tag 打一个tag
  3. git tag 在某一条commit上打tag
  4. git tag -m 打上tag并且添加message
  5. git push origin 将tag push到远程
  6. git tag -d 本地删除某个tag
  7. git push origin :refs/tags/ 远程删除tag

git 远程操作

  1. git remote add origin [email protected]:xxx.git 添加远程主机关联
  2. git remote prune origin --dry-run 看看有哪些没用的分支需要清除
  3. git remote prune origin 清除跟踪
  4. git push --set-upstream origin/master master 关联本地分之于远程分之
  5. git push -f 强制提交,尽量不要使用!!!!

git 提交部分文件或文件夹到别的分支

  1. 假设现在有个需求,要将master代码打包到dist文件夹中,这时候本地.gitignore忽略了dist文件夹,但是别的分支又需要这份dist打包好的项目。此时远程有master,本地也有master,再无别的分支。
  2. 本地git checkout -b other, git add -f dist, git commit -m "init other", git subtree push --prefix dist origin other 这样下来,other分支只有dist文件夹了。

本文作者原创,仅供学习交流使用,转载需注明出处。

你可能感兴趣的:(git 常见操作总结)