常用的Git命令与使用场景

350 阅读5分钟

Git基本命令

这些是我工作中经常用到的git命令和流程,有谬误和有不足之处,请大家帮忙指证。

拉取代码

git clone  http://gitee.com/master.git
// 指定分支
git clone -b  brach-name http://gitee.com/master.git

提交到本地

git add .
git add 文件名

git commit -m 'commit信息'

// 一次搞定
git add . && git commit -m 'commit信息'

查看状态

git status

查看提交日志

git log

// 一条日志打印一行
git log --pretty=oneline

git reflog
  • 查看单个文件的提交日志
git log -p file
  • 显示分支线
git log --graph
git log --graph --pretty=oneline

q推出查看

回退

  • 将暂存文件回退 到 修改状态
git reset
  • 软回退,将commit的代码回退,代码会保留
// 前一次
git reset --soft HEAD^
// 前两次
git reset --soft HEAD^^
// 前10次
git reset --soft HEAD~10

// 回退到指定commit
git reset --soft commitID
  • 硬回退,本地commit但未push时慎用,会造成代码丢失
git reset --hard HEAD^
git reset --hard commitID

回退后代码丢失,怎么找回?

1.有过commit,但是未push

  • 执行 git reflog
  • 执行 git reset --hard HEAD@{7}

2.有过add,但是未commit

  • 执行:git fsck --lost-found

  • 在项目git目录下的 /.git/lost-found/other里有你add过的文件

  • 或者执行:find .git/objects -type f | xargs ls -lt | sed 60q

  • 找回本地仓库里边最近add的60个文件,

  • 根据 commitID 来pick这次commit

git cherry-pick commitID

拉取

  • 拉取当前分支最新代码
git pull
  • 拉取仓库最新分支
git fetch

分支

  • 查看分支
git branch

git branch -a
  • 分支重命名
git branch -m oldBranch newBranch
  • 删除分支
git branch -D removeBranch1 removeBranch2
  • 批量删除分支
// 批量删除 以dev开头的分支
git branch | grep 'dev*' | xargs git branch -d
  • 新建分支
git branch 分支名
  • 切换分支
git checkout 分支名

stash 暂存,暂存区是栈型结构(先进后出)

  • 暂存当前未提交代码
git stash
  • 查看暂存列表
git stash list

  • 应用最近的一次暂存,会将栈顶的stash pop出来,会被清除
git stash pop
  • 应用某一次暂存,暂存不会被清除
git stash apply stash@{x}
  • 清除暂存
// 清空暂存列表
git stash clear
// 清除某一次暂存
git stash drop stash@{x}

合并

  • 将其他分支代码合并到当前分支
git merge origin/master

rebase大法

  • rebase要在自己的分支上操作
git rebase master
// 终止rebase操作,回到执行rebase指令前的状态
git rebase --abort
// 解决了合并冲突后,继续应用剩余commit
git rebase --continue 

rebase详解

mergerebase的区别

  • merge命令会保留原始的 commit时间,合并到其他分支后会新增一个合并的commit信息,
  • git记录是分叉的,自己的commit会按照时间插入主分支,会和其他commit混在一起
master------1------2------3---------------
             \                  / merge
branch         ----a------b----

合并后的记录
master ---1-----2-----a-----3------b-----merge commit---
  • rebase命令会修改你的commit时间信息,将你的commit集中放在master的最前面
  • rebase不会产生新生新的commit记录,分支的commit更加集中,commit历史更干净
master------1------2------3---------------
             \                  / rebase
branch         ----a------b----

合并后的记录
master ---1-----2-----3------a------b-----

命令简写

git clone 简写 gcl
git add 简写 ga
git commit 简写 gc
git branch 简写 gb
git checkout 简写 gco
git cherry-pick 简写 gcp

使用场景

项目怎么用git管理?

  • 会生成.git隐藏目录,不想用git管理了可以删除改目录
git init

添加账号,设置提交账号和邮箱

// 设置全局
git config --global user.name "Author Name"
git config --global user.email "Author Email"

// 或者设置本地项目库配置
git config user.name "Author Name"
git config user.email "Author Email"

远程仓库建好了,怎么把代码push上去?

  • 将代码首次推送到git仓库
// 1、添加远程仓库地址
git remote add origin https://gitee.com/miller_wang/xxx.git

// 2、获取远程库与本地同步合并(如果远程库不为空必须做这一步,否则后面的提交会失败)
git pull --rebase origin master

// 3、推送到远程仓库
git push -u origin master

当前还有未提交的代码,怎么切换到其他分支?

  1. git stash 暂存当前未提交代码
  2. 切换到其他分支,完成其他任务
  3. 切回到当前分支 执行 git stash pop将暂存的代码应用到当前分支

合并到目标分支有冲突

  1. 切换到目标分支,执行git pull拉取目标分支最新代码
  2. 切回当前分支,执行 git merge 目标分支,将目标分支代码合回当前分支
  3. 修复冲突,提交代码,再进行合并操作

提交的commit信息不对,怎么改?

  1. 执行git reset --soft HEAD^,回退最近一次commit
  2. 软回退之后代码还在,再提交一次

提交的commit信息已经push上去了,怎么改?

  • 前两步同上,push时加上 -f, push -f强制推送,会将远程代码的commit覆盖掉

想将代码回退到某一次的提交?

  • 找到这次提交的commitID,执行 git reset --hard commitID

最近提交了5个commit,第2个、第4个commit的代码不想要了?

  1. 将代码回退到5个commit之前,
git reset --hard HEAD~5

或者找到 5次提交前的commitID

git reset --hard commitID
  1. 找到第1、3、5次提交的commitID,依次cherry-pick
git cherry-pick 1
git cherry-pick 3
git cherry-pick 5

fork了一个项目,怎么将源项目的最新代码同步到本地?

  1. 再添加一个 remote 地址,forkOrigin 是这个远程仓库的名字
git remote add forkOrigin https://gitee.com/xxx.git
  1. 拉取 源项目 最新代码
git pull forkOrigin master

小结

如果这篇文章对你有帮助,请帮我点个赞吧