git常用操作总结

196 阅读6分钟

git【分布式版本管理系统】

git 相关命令

git [--version] [--help] [-C <path>] [-c <name>=<value>] 
    [--exec-path[=<path>]] [--html-path] [ --man-path] [--info-path] 
    [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare] 
    [--git-dir =<path>] [--work-tree=<path>] [--namespace=<name>] 
    [--super-prefix=<path>] [--config-env=<name>=<envvar> ] 
    <命令> [<参数>]

配置账号的邮箱

  • git config --global user.name ex: git config --global 'henkuaixuexi'
  • git config --global user.email ex: git config --global 'henkuaixuexi@example.com'

检查配置信息

  • git config --list

仓库初始化

  • git init 【将当前目录初始化为git代码仓库】
  • git init [project-name] 【新建一个目录,将其初始化为Git代码库】

克隆

  • git clone [url] 【 url有两种类型 1、https 2、SHH】

远程仓库关联关系

// 如果想切换clone仓库类型
git remote -v                   // 查看远程仓库连接关系
git remote rm origin            // 删除远程连接
git remote add origin [url]     // 与远程仓库建立连接

// ------或者-----------

git remote set-url origin [url]【更换远程仓库地址】

提交

  • git add -u 【git add --update的缩写 将被修改和删除的文件提交到暂存区】
  • git add . 【将修改和新增的文件提交到暂存区】
  • git add -A 【git add --all的缩写 提交修改、删除、新增的文件到暂存区】

commit

  • git commit -m type(scope): subject 【type必须 scopeke可选 subject必选】 ex: git commit -m 'feat: xxx功能开发'

    type: 用于说明git commit的类别,只允许使用下面的标识

标识含义
feat新功能(feature)
fix/to修复bug。fix:产生diff并自动修复此问题。适合于一次提交直接修复问题;to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix
docs文档(documentation)
style格式(不影响代码运行的变动)
refactor重构(即不是新增功能,也不是修改bug的代码变动)
perf优化相关,比如提升性能、体验。
test增加测试
chore构建过程或辅助工具的变动
revert回滚到上一个版本
merge代码合并
sync同步主线或分支的Bug

scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。 例如在Angular,可以是location,browser,compile,compile,rootScope, ngHref,ngClick,ngView等。如果你的修改影响了不止一个scope,你可以使用*代替。

subject是commit目的的简短描述,不超过50个字符。

注:修改完冲突, 我们会进行commit提交冲突修改. 不要使用git commit -m, 请直接使用git commit, git会识别你这是一个冲突提交。

状态管理

命令含义
git status查看本地文件变更情况
git stash将本地变更提交到缓存区
git stash list查看stash了哪些存储
git stash show显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
git stash apply应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
git stash drop stash@{0}将stash@{0}次暂存删除
git stash pop恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
git stash clear 删除所有缓存的stash

注:新增的文件,直接执行stash是不会被存储的 说白了就是没有在git 版本控制中的文件,是不能被git stash 存起来的 先add 再stash就好了~

push操作

  • 推送变更到远程仓库 | 当前分支 | git push |git push origin release |git push origin release:dev | | --- | --- | --- | --- | | release |将本地relase分支推送到远端relese分支| 将本地relase分支推送到远端relese分支|将本地relase分支推送到远端dev分支 (好诡异的操作)|

  • 创建一个新的分支,并将其推送到远程仓库

  1. git branch -b dev
  2. git push --set-upstream origin dev

分支管理

命令含义
git branch列出本地所有分支
git branch test基于当前工作分支创建新的test分支
git checkout test切换到test分支
git checkout -b test创建并切换到test分支 = git branch test + git checkout test
git checkout -b test origin master 基于远端master拉取本地test分支并切换到test分支
git branch --merged 查看已经合并到当前分支的分支
git branch --no-merged查看没有合并过当前分支的分支
git branch –d test删除本地test分支
git branch -D test 强制删除没有合并过的test分支
git push origin --delete test删除远端test分支
git branch --set-upstream-to=origin/test test关联远端test与本地test分支关联。本地分支下进行pull 和push操作时 ,便不需要指定远程的分支,直接git pull 或者 git push即可
git branch -m test test1本地分支test重命名为test1
git merge test将test分支合并到当前分支
git merge --abort存在冲突时,不想合并,可以取消这次合并

git branch | grep -v "test" | xargs git branch -D 删除本地除test分支以外的所有分支

git branch -r | grep -v "test" | xargs git branch -D -r 删除远端除test分支以外的所有分支

日志

| 命令| 含义 |博主心得|| | ------------ | --- |---|-----------|| | git log | 查看当前工作分支的commit日志 |好用!!!清楚的看到分支下的commit记录、作者、操作时间等 如图 |image.png| |git log --oneline|一行情书版|一行展示优雅完美|image.png | git log -p|查看提交记录并且展示具体修改 |git log --oneline --graph test| 可以以图形的方式查看test分支commits,不加test就是查看当前工作分支|绝绝子!! 如下图| image.png|图示解读:星号表明这个提交所在的分支;最左边的直线表示当前分支的历史状态,从图看,当前分支HEAD是master分支 ;提交历史是:8cfbb25<--d486463<--a88c595<--fc46826<--275823b<--5d66385<--33c6d2e,箭头方向表示依赖方向,父节点方向|非当前分支的情况,方法是,顺着分支起点(有分支名字的地方)开始顺着曲线往下撸,遇到分叉(星号处才称之为分叉)点,往最左边走|分支test1的提交历史:d486463<--bb7cb66<--ac202c8<--8e64613(test1);下面来看下分支test2的提交历史:d486463<--811c466<--f3553f4(test2)| |切换到分支test1,再看分支master的情况:<--<--<--<--d486463<--a88c595<--fc46826<--275823b<--5d66385<--33c6d2e(master)| |借鉴前辈 git reflog --oneline|可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录、commit reset、merge 等所有操作)

diff

命令含义
git diff工作区和暂存区进行diff
git diff src/app.jsdiff文件路径(git status)下的当前文件
git diff test1 test2test1和test2diff
git diff --cached暂存区和远端diff
git diff HEAD工作区和远端diff

还原和重置

  • 还原
命令含义
git checkout .放弃工作区中的全部修改
git checkout -- src/app.js放弃工作区中app.js文件(git status找到这个文件路径)中的修改
git checkout [commitId] [file]恢复某个commit的指定文件到工作区

git checkout其实是就是用远端的版本替换工作区的版本

  • reset
命令含义
git reset -- src/app.js重置暂存区的这个文件到上一次commit,工作区不变
git reset --hard重置暂存区与工作区到上一次commit
git reset [commitId]重置当前分支的指针为指定commit,同时重置暂存区,但工作区保持不变
git reset --hard [commitId]当前分支的HEAD为指定commit,同时重置暂存区和工作区
git reset --keep [commitID]重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset HEAD --src/app.js 回退暂存区到工作区的修改,再执行git checkout -- src/app.js将会回退到上一次提交时的版本
git reset --hard HASH返回到某个节点,不保留修改
git reset --soft HASH返回到某个节点。保留修改
  • revert
命令含义
git revert [commitId]新建一个commit,用来撤销指定commit(git log找到制定的commitId),后者的所有 变化都将被前者抵消,并且应用到当前分支
  • clean
命令含义
git clean -n显示 将要 删除的 文件 和 目录
git clean -f删除 文件
git clean -df删除 文件 和 目录 返回到某个节点

变基

  • 使用 rebase 来将远程的变更整合到本地仓库是一种更好的选择。用 merge 拉取远程变更的结果是,每次你想获取项目的最新进展时,都会有一个多余的 merge 提交。而使用 rebase 的结果更符合我们的本意:我想在其他人的已完成工作的基础上进行我的更改。
  • 使用 rebase 的交互模式可以重写提交历史

下面用例子来区分rebase与merge区别:

  1. 我们在master提交一次C1。
  2. 然后从master分支checkout出test分支,提交两次C2。
  3. 然后切回master,提交一次C3并且C3与C2修改同一行代码,制造冲突。
  4. 在master 上提交一次C4。
  5. 然后切换到test 上提交一次C5。
  6. 切换到master上合并test git merge test 生成的提交线为 C1 > C2 > C3 > C4 > C5 > C6,这是按照提交事件来进行合并,C6 为解决C2与C4造成冲突的新修改,但是, 用rebase就得到的不一样结果。
  7. 退回到merge之前的操作。
  8. 然后git rebase master 此时git提示代码冲突,处理冲突 git add.。
  9. git rebase --continue (加上--continue参数让rebase继续处理)
  10. 然后git checkout master。
  11. git merge dev
  12. 此时master处理完的提交线为 C1>C3>C4>C2>C5, 能够看出dev是变基线为master最新一次提交,然后再合并dev两次提交。

如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

变基有风险~ 其他的本博主还没学废

image.png

tag 打标签

命令含义
git tag查看所有tag
git tag v1.0.0为当前版本打一个1.0.0的tag
git tag v1.0.0 [commitId]在某一条commit上打v1.0.0的tag
git tag v1.0.0 -m 更新xxxx打上v1.0.0的tag并且添加message ‘更新xxxx’
git push origin v1.0.0将tag push到远端
git tag -d v1.0.0本地删除v1.0.0tag
git push origin :refs/tags/v1.0.0远端删除v1.0.0tag

注:根据git版本不同,一些命令可能有一些小差异啦~