常用git命令说明汇总

概念:

  • 理解git版本仓库和svn的区别
  • 理解git暂存区、本地仓库、工作区、远程仓库的区别,以及相关指令对这三个工作的操作
  • 熟悉git暂存区、本地仓库、工作区相互转化
  • 理解git在项目管理中的管控流程,master分支、release分支、dev分支、feature-*分支、hotfix分支的作用
  • 理解正常开发模块功能的操作-常用命令
  • 理解产生冲突的原因及如何查看和解决冲突
  • 熟悉git log提交日志查看
什么是git?
官方话:Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。

引用廖雪峰老师的话,它能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以。 

常用命令:

创建分支:git branch feature1
切换分支:git checkout feature1
切换分支到上一个分支:git checkout -
创建并切换到分支1:git checkout -b feature1
创建并切换到分支2:git switch -c feature1
提交未跟踪文件和已修改文件到暂存区:git add .
暂存区代码提交到本地仓库:git commit -m “”
提交代码到本地仓库(已存在文件使用):git commit -am “”
本地仓库推送到远程仓库:git push origin feature1
从暂存区回退到工作空间:git reset
从暂存区回退指定文件到工作空间:
从本地仓库回退到暂存区:git reset --soft HEAD^
从本地仓库回退指定文件到工作空间:
从本地仓库回退到工作区(可省略--mixed,默认):git reset --mixed HEAD^ 或者git reset --hard HEAD~1 或者git reset --hard commit_id
回退到上一个版本(最近一个commit将丢失):git reset --hard HEAD^
撤销工作区的全部修改:git checkout .
撤销工作区的指定文件的修改:git checkout -- file1.txt
存储工作空间的所有修改:git stash
从缓冲区恢复存储的修改:git stash pop stash{0}
删除本地分支:git branch -d feature1
删除远程分支:git push origin :feature1 或者 git push origin  --delete feature1
从某个分支检出指定文件到当前分支上:git checkout feature1 file1.txt
删除未跟踪的文件:git clean -nfd
移除本地分支中所有远程不存在的分支:git fetch -p
远程分支强制覆盖本地分支:git fetch --all && git reset --hard origin/master && git pull
合并分支到当前分支:git merge --no-ff feature1 或者 git merge --no-ff -m '合并描述' feature1
还原被删除的文件(暂存区还原): git restore --staged <file>
还原被删除的文件(工作区还原):git checkout <file>
从某个提交的版本还原被删除的文件:git checkout [commit_id] -- <path_to_file/file>

git tag:

每一个版本发布后,可以根据版本好打一个标签

1、	git创建tag(附注标签):git tag -a “标签名称”-m “标签描述”
2、	git提交本地标签到远程:git push origin 要提交到远程的标签名称
3、	git删除tag标签:git tag -d “要删除的标签名称”
4、	git重命名标签名称:git tag 新的标签名称 存在的被重命名的标签名称
5、 git推送标签到远程仓库: git push origin 标签名
6、 git推送所有标签到远程仓库:git push origin --tags
7、 git从远程仓库中删除标签: git push origin :refs/tags/标签名
8、git查看本地标签:git tag
9、git查看远程标签:git ls-remote --tags
10、git检查标签:git checkout 标签名称

git log:

1、	查看日志:git log
2、	查看git log的美化日志:git log --pretty=oneline
3、	查看简化的git log的美化日志:git log --oneline
4、	查看日志(适合于回退版本信息):git reflog
5、 查询commit信息中包含“修复”内容的提交:git log --all --grep='修复'
6、 获取某人的提交日志:git log --author="zouxiangui"
7、查看最近3条更新日志,并且简单显示出所涉及的文件: git log -3 --stat

git branch:

1、查看所有分支(包括远程分支,只列出远程分支实用git branch -r):git branch -a
2、创建分支:git branch feature1
3、切换分支:git checkout feature1
4、创建并切换分支:git checkout -b feature1
5、重命名本地分支:git branch -m <new-branch-name>
6、切换到上一个分支:git checkout -
7、查看本地分支关联远程仓库的情况: git branch -vv
8、关联远程分支,没有关联远程分支就没有merge对象,比如新创建的分支feature1,要合并release分支的话需要执行git pull origin release
 (1)  git branch -u origin/feature-test		指定关联远程分支
  (2)  git push origin/feature-test -u	推送本地到远程分支时(远程不存在时)
  (3)  git branch –set-upstream-to=origin/feature-test feature-test
  (4)  git remote show origin	查看远程分支和本地分支的对应关系
9、删除本地分支(强制删除-d改为-D):git branch -d feature1
10、删除远程分支(还有一种方式实用git push):git branch -d -r origin/feature1	

git diff

1、比较的是工作区和暂存区的差别: git diff 
2、比较的是暂存区和版本库的差别:	git diff --cached 
3、可以查看工作区和版本库的差别: git diff HEAD 
4、查看两个分支的有什么不同,列出所有差异:git diff release master
5、查看两个分支有哪些文件有什么不同的:git diff release master --stat
6、查看两个分支具体文件有什么不同的:git diff release master -- 文件名

git stash

git stash: 暂存,存储
1、对修改的文件暂存到缓存区:git stash  
2、对修改的文件暂存到缓存区:git stash save "日志信息"
2、清空工作区的修改git checkout . (因为恢复储藏信息的时候)
3、弹出修改内容git stash pop  (成功后暂存列表里面就没有了)

查看保存的内容列表 git stash list
	stash@{0}: WIP on master: 452b08d rename hello as hello.c
	stash@{1}: WIP on master: 452b08d rename hello as hello.c
查看具体修改内容 git stash show stash@{X}   其中‘X’表示列表号,执行git stash list查看
弹出所需的内容修改 git stash apply stash@{X}  (git stash pop弹出栈顶内容)
丢弃暂存内容的修改 git stash drop stash@{1}  (否则修改内容还继续保留在暂存列表)
保存时打标记 git stash save "this is func3" (多次暂存会比较乱,git stash list区分不明显,故使用git stash save)
当从缓存区取出修改的文件时,无论放到哪个分支,
  • 编辑上一次提交的内容:git commit --amend -m “更好的提交日志”

  • 在上次提交中附加一些内容,保持提交日志不变git add . && git commit --amend --no-edit

  • 空提交 —— 可以用来重新触发 CI 构建:git commit --allow-empty -m “chore: re-trigger build”

  • git rm --cached aaa.txt 撤回暂存区的文件到工作区

  • rm -f aaa.txt 直接从工作区删除文件

  • git rm -f aaa.txt 删除暂存区文件,它不会撤回工作区,即暂存区和工作区都删除了这个文件

  • 查看当前分支是从哪个分支拉出来的:git reflog --date=local | grep 分支名称

  • 移除缓存区的缓存文件:git rm --cache

  • git合并一个分支上改动的部分文件到另外一个分支:
    git checkout --patch branch file/dir
    例子:git checkout --patch branch src/com/lacesar/sos

  • 删除远端分支: git push origin --delete Chapater6 或者git push origin :Chapater6

  • 删除当前分支外的所有分支:git branch | xargs git branch -d
    根据分支名称批量删除指定字符分支:git branch | grep ‘kdb*’ | xargs git branch -d
    命令解释:git branch 用于列出本地所有分支
    grep 搜索过滤命令。使用正则表达式搜索文本,并把匹配的行打印出来。
    xargs 参数传递命令。用于将标准输入作为命令的参数传给下一个命令。

  • git远程分支覆盖本地分支方式2:
    git pull --force origin <远程分支名>:<本地分支名>

  • 从远程分支中创建并切换到本地分支:git checkout -b origin/

  • 解决冲突,确定你需要的是哪个仓库的文件:
    git checkout --theirs conflicted_file.txt # 保留远端的
    git checkout --ours conflicted_file.txt # 保留本地的

  • git merge产生冲突解决1:

报错:error: You have not concluded your merge (MERGE_HEAD exists)
解决办法一:保留本地的更改,中止合并->重新合并->重新拉取
git merge --abort 		# 终止合并请求,Git版本 >= 1.7.4, git reset --merge	# 终止合并请求,Git版本 >= 1.6.1
git pull
解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)
$:git fetch --all
$:git reset --hard origin/master
$:git fetch
  • git rebase产生冲突解决2:
git fetch origin release  # 更新远程跟踪分支到本地仓
git rebase origin/release 	# 合并代码,产生冲突找到冲突的代码 ,手工修改
git rebase --continue    # 再次合并代码
git push --force origin feature1   # 将分支feature1提交到远程仓库,一般由开发人员在自己分支解决冲突然后提交合并请求

# 运维人员在本地合并feature1后推送本地release分支到远程
git checkout release    # 切换到主干release分支
git merge feature1 # 在主干分支上合并分支feature1
git commit -a -m "合并分支后提交"
git push origin release  #  本地拉取 服务器代码

场景测试:

1、从master分支拉取出分支release、feature1,feature1分支提交修改合并到master,然后从master取出feature2分支提交修改合并到master,两个分支修改内容是不是同一个文件,此时,把feature2分支提交合并到release,问题:此时master分支合并到release分支会提示什么?两个分支是否一致,指针指向呢?

2、从master拉取分支release,从release拉取分支feature-dev-zhangsan、feature-dev-lisi,切换到feature-dev-zhangsan分支,依次增加在同一个文件修改增加一行status1、status2、status(对应三个commit信息),推送到远程合并到release;切换到feature-dev-lisi,更新release,增加一个提交status4,推送到远程合并到release;切换到release,更新;分别观察三个分支的提交信息。观察后,尝试在feature-dev-zhangsan分支上执行回滚会发生什么?
张三
在这里插入图片描述
李四
在这里插入图片描述
release
在这里插入图片描述
正常情况下,我们从release分支拉出来的分支feature各自独立开发,假设没有开发共同的模块,即你需要另一个同事开发的代码,在自己分支开发功能的时候,不需要执行git pull命令,修改完成,直接提交即可。
如果有需要从另一个分支(另一个同事开发)那更新代码(需要一个方法),则该分支提交合并到release分支,自己再从release上更新下来,因为自己是从release拉取的分支,所以执行指令git pull –rebase origin/release,加上—rebase后不回在你的分支生成一个commit合并请求。

3、存在分支master、release、feature1分支、hotfix

feature1分支从master拉出来的,然后合并到了master分支,但是并没有从master分支合并到release分支;
此时从master拉出来的另一个分支feature2,使用git checkout --patch 远程分支 文件/文件夹命令,把
release分支的代码覆盖了feature2分支,导致还原了文件,此时master分支丢失了已修改的内容;此时,重新
把hotfix分支merge到master或者release分支,提示Already up to date.;把master分支merge到hotfix
分支(git pull),则可以合并替换了hotfix修改的内容。

问题:两个分支有不同的内容git是如何确定是否执行合并的,即有时候为什么合并不了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值