git 基础命令

基础命令

https://gitee.com/all-about-git 大全

  • 克隆项目
git  clone https://gitee.com/Armink/FlashDB.git
  • 将改动从工作区移动到暂存区
git add . 或者 git add 文件名
  • 将暂存区改动提交本地仓库
git commit -m "提交说明 例如 #223 [修改] 修改前端规范"	
  • 推送本地仓库至远程仓库
git push
  • 拉取远程代码至本地
git pull

git 配置项

  • 配置用户名
git config --global user.name "wangzixing"	
  • 配置邮箱
git config --global user.email "wangzixing@qq.com"	
  • 列出全局配置
git config --global --list	

git日志

  • 查看当前分支所有日志
git log
  • 查看commit_id 和提交信息
git log --pretty=oneline
  • 查看某次提交的详细信息
    git show be24e214620fa072efa877e1967571731c465884

  • 查看某次提交中新版和旧版的对比信息
    git diff 0134af0400597b85ac80b08ff0344f1a115ddc32
    可以看到符号 “+“ (绿色),表示添加的内容。如果有 “-”(红色)则表示删除的内容。

  • 查看最近的4条日志

git  log -n 4

git版本操作

  • 回退到上一个版本
git reset --hard HEAD^
  • 回退到指定版本
git reset --hard commit-id
  • 把已经add但是尚未commit的文件重新放回工作区
git reset HEAD index.php
  • 丢弃工作区文件的修改,还原成版本库的样子
git checkout  index.php
#丢弃全部
git checkout .  
#如果误删除了一个文件恢复
git checkout index.php
(1) 要放弃目前本地的所有改变时候,即去掉所有add到暂存区的文件和工作区的文件,
可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;
(2) 真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题
2. --soft
回归到某个commit但是文件不会变,只是这些文件变成了差异修改,状态类似于你写完代码 add 完的那一刻
原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files),所以假如我们之前工作目录没有改过任何文件,也没add到暂存区,那么使用reset --soft后,我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。为什么要这样呢?这样做的使用场景是:假如我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就commit,这样做导致一个完整的功能可能会好多个commit点,这时假如你需要把这些commit整合成一个commit的时候)時,可以考虑使用reset --soft来让 commit 演进线图较为清晰。总而言之,可以使用--soft合并commit节点
3.--mixed(默认)
回归到某个commit但是文件不会变,只是这些文件变成了差异修改,类似于你刚写完代码那一刻
(1)使用完reset --mixed后,我們可以直接执行 git add 将這些改变果的文件內容加入 index 暂存区中,再执行 git commit 将 Index暂存区 中的內容提交至Repository中,这样一样可以达到合并commit节点的效果(与上面--soft合并commit节点差不多,只是多了git add添加到暂存区的操作);(2)移除所有Index暂存区中准备要提交的文件(Staged files),我们可以执行 git reset HEAD 来 Unstage 所有已列入 Index暂存区 的待提交的文件。(有时候发现add错文件到暂存区,就可以使用命令)。(3)commit提交某些错误代码,或者没有必要的文件也被commit上去,不想再修改错误再commit(因为会留下一个错误commit点),可以回退到正确的commit点上,然后所有原节点和reset节点之间差异会返回工作目录,假如有个没必要的文件的话就可以直接删除了,再commit上去就OK了。
3.--keep
类似于--hard 会归到某一刻但是文件是会变的,但是本地的工作区和暂存区东西不会变

4. 操作之前


5. 操作之后

git stash 暂存

当你在一个分支上进行修改代码的时候,已经修改了许多,但是又要切换到另外一个分支进行修改.但是不想进行commit进版本库,可以放在文档库
  • 保存所有修改过的文件(受到版本控制的)
git stash
##指定保存名称
git stash save temp
  • 所有暂存列表
git stash list
  • 从文档库中取出一个暂存
git stash list
  • 从文档库中取出一个暂存,指定下标
    下标通过git stash 返回的stash@{0} @符号后面大括号内
git stash apply 0
  • 查看某个暂存中存了哪些文件
git stash show 0
  • 丢弃某个暂存
git stash drop 0

git分支

Git 的默认分支名字是 master

  • 查看当前所在分支
git branch
  • 创建分支
    分支名称为test
git branch test  
  • 创建分支示意图

    image

    image

  • 切换分支
    此时的 修改和提交操作都是基于test分支之上的

git checkout test
  • 合并分支
    master分支合并test 分支上的修改
git checkout master
git merge test
  • 删除分支
    不能处于test分支上删除test分支
git branch -d test
删除远程分支
git push origin --delete test
  • 解决合并分支的冲突
    如果处于两个不同的分支中且不存在上下游的关系, 如A和B A本地修改了index.php的第一行 B也修改了index.php的第一行 A合并B的时候就会出现冲突
    git merge B
    Auto-merging index.php
    CONFLICT (content): Merge conflict in index.php
    Automatic merge failed; fix conflicts and then commit the result.

    打开index.php

    <<<<<<< HEAD:index.php 
    这部分中的内容是你当前分支中的代码
    =======
    这部分内容是你要合并的B分支中的内容
    	>>>>>>> B:index.php
    
     解决冲突的办法就是把这段中留一个并且删除这些符号
    保存完文件之后
    git add index.php 标记为冲突已解决
    
  • 查看合并文件的状态

git status
  • 列出所有远程分支和本地分支
git branch -a
  • 查看分支的详细信息
    如果想要查看设置的所有跟踪分支,可以使用 git branch 的 -vv 选项。 这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。
git branch -vv
  • 查看当前远程厂库
git remote
  • 添加远程厂库
git remote add new_base https://gitee.com/Armink/FlashDB.git
  • 抓取远程厂库有而本地没有的数据
    不加仓库名默认origin
git fetch new_base
  • 提交当前分支到远程仓库
git push origin HEAD -u
  • 克隆指定分支
git clone -b test
  • 查看其他分支中的某个文件内容
git show test:index.php
  • 合并参数区别

    fast-forward
    
    Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,
    
    叫做“快进”(fast-forward)不过这种情况如果删除分支,则会丢失merge分支信息。
    
    –squash
    
    把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历
    
    史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额
    
    外的commit来“总结”一下,然后完成最终的合并。
    
    –no-ff
    
    关闭fast-forward模式,在提交的时候,会创建一个merge的commit信息,然后合并的和master分支merge的不同行为,向后
    
    看,其实最终都会将代码合并到master分支,而区别仅仅只是分支上的简洁清晰的问题;然后向前看,也就是我们使用reset
    
     的时候,就会发现,不同的行为就带来了不同的影响
    

    image

标签

  • 创建一个标签,基于当前HEAD
    git tag -a v0.2
  • 在某个commit上打tag
    git tag v0.2 9646a011
  • 查看标签列表
    git tag -l
  • 查看标签详细信息
    git show v0.2
  • 推送标签到远程仓库
    git push origin tag v0.2
  • 删除标签
    git tag -d v0.2

Resbase 变基

压缩合并commit

  • 变基指定版本之间
git rebase -i 3a4226b

之后出现vim 编辑输入,在没有注释的地方替换

pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
  • 继续变基
git rebase --continue
  • 终止变基
git rebase --abort
  • pull 时候变基
git pull --rebase

优选

某个分支需要用到其他分支的一个或者多个提交,其他仓库的需要通过git remote add先添加

  • 先看所需要的commit 所在分支的日志
git log test
  • 获取某个commit
git cherry-pick 8944e27378d13a3ed779ca9960ee555ae4acbf4b
  • 发生冲突的时候需要解决冲突解决完成通过来标记已解决
git add index.php
  • 然后执行继续优选的命令
git cherry-pick --continue
  • 取消优选的命令
git cherry-pick --abort

补丁(patch)

补丁是一个文本文件,其内容类似于git diff,但与代码一样,它也有关于提交的元数据; 例如提交ID,日期,提交消息等。我们可以从提交创建一个补丁,而其他人可以将它们应用到他们的存储库。

  • 创建两个commit 之间的所有commit (开始不包括自己,结束包括自己),有多少次提交就生成多少个文件
    git format-patch 【commit sha1 id】..【commit sha1 id
    git format-patch 1b17da..89widawf
  • 将生成的所有.patch文件放到一个文件夹下,然后拷贝到待打补丁的地方
  • git 查看一个 patch 文件的统计信息
    git apply --stat ./patch/*.patch
  • Git分别提供两个命令:git am 和 git apply 来应用补丁。 git apply修改本地文件而不创建提交,而git am会修改文件并创建提交。
    git am --abort (撤销之前的错误应用补丁,如果有之前错误的补丁则无法应用)
    git am --keep-cr ./patch/*.patch (如有trailing whitespace 的错误,则是空白换行的问题,忽略)
    git log 查看提交记录
    补丁应用成功
posted @ 2022-09-01 18:34  万隆  阅读(36)  评论(0编辑  收藏  举报