美文网首页
git 常用命令集

git 常用命令集

作者: cdz620 | 来源:发表于2020-03-04 09:40 被阅读0次

    初始化

    工程初始化

    • git init demo 会直接生成demo的目录
    • mkdir demo && cd demo && git init

    已追踪文件提交修改

    1. git add -u update更新已经追踪的文件,到本地仓库,相当于git add trackedFile
    2. git commit -m "haha" 提交
    3. git push 将修改推送到服务器

    新增文件提交修改

    • git add newFile
    • git add -A 添加所有已经追踪的文件的更改
    • git add -f .gitignore中存在也强行添加到暂存区
    • git add -p 可以对比work 和index 间的区别,提供给用户对比后再提交部分确定的更新
    • git commit -m "haha"

    git reset 重置一般针对暂存区操作

    git reset [--soft|--hard|--mixed] <commit_id>

    • hard修改的步骤如下:
    1. 替换master(refs/master 文件所指向的commit_id)
    2. 替换暂存区的内容
    3. 替换工作区的内容 (这一步比较危险,会覆盖工作区)
    • soft 只执行第一步操作
    • mixed 执行 1 和 2 的操作,默认是mixed
    • git reset 相当于git reset --mixed HEAD . 默认是操作所有的文件,相当于放弃暂存区的修改
    • git reset -- filename 将filename文件的改动撤出暂存区,相当于git add filename的逆操作,双减号只是区分commit_id 和 文件名
    • git reset HEAD filename 效果如同git reset -- filename
    • git reset HEAD^ == git reset --mixed HEAD^ 放弃上一次的git add 操作
    • git reset --hard HEAD^ 彻底放弃上一次的更改

    删除暂存区的修改

    • git rm --cache file

    删除文件

    • git rm file 该命令会删除工作区和暂存区的文件,提交后版本库的文件才会删除

    移动文件

    • git mv haha.txt README

    例子

    • git reset --hard HEAD^ 重置到上一个老的提交分支上,该命令会破坏工作区未提交的的改动,慎用,该操作无法通过git log找回,git log 上不会保存该记录
    • git reflog show master 可以查看到git reset --hard的修改
    • git reset --hard master@{2} 可以找回git reset --hard的修改,master@{2}通过git reflog show master 找到

    git checkout 检出,一般针对工作区操作

    主要的三种用法

    • git checkout [<commit_id>] [--] <paths> 从某个commit_id 提取某个文件到当前工作区
    • git checkout BranchName 切换分支名
    • git checkout -b NewBranch [<start_point>] 创建新分支

    分离头指针状态

    • 正常情况下,HEAD 都指向分支引用的文件,如:refs/heads/master,但是如果执行git checkout <commit_id>就会导致HEAD指向特定的commit_id的情况,这种现象就叫做“detached HEAD”,解决办法:git chekout -b <NewBranchName>
    • 如果没有在出现头指针的情况下,及时创建新分支,并且已经做了修改并提交,此时的提交并不会记录在之前的分支记录上,记录在断头的分支上,解决方法如下:
    1. 切换到要将该修改合并到哪个分支上: git checkout master
    2. 根据commit_id合并: git merge aacc87 commit_id 通过git log查看,断头模式的记录一般保存会有个超时时间,应尽早合并

    git checkout 命令列表

    • git checkout == git checkout HEAD
    • git checkout -- filename 用暂存区中的文件替换工作区中的文件, file包含.git路径到文件的相对路径
    • git checkout master -- filename 用分支master中的filename覆盖工作区和索引区的文件
    • git checkout . == git checkout -- . 用暂存区的所有文件替换工作区文件
    • git checkout HEAD . 从版本库中获取文件覆盖暂存区和工作区的修改:
    • git checkout HEAD file 用版本库的文件覆盖暂存区和工作区
    • git checkout HEAD~1 -- haha.txt 星号相当于向前查找某个版本
    • git checkout hello-1.x 这边的hello1.x是远程分支的话,会创建和远程分支一样分支名的本地分支,会建立和远程分支的跟踪关系,如果是本地分支,则不会有跟踪关系
    • git checkout --track -b hello-1.x.bak hello.1.x 建立追踪关系,git pull 可以直接拉取更新
    • git checkout hello-1.x origin/hello-1.x 显示创建和远程分支一样名字的本地分支,会建立和远程分支的跟踪关系

    git cherry-pick <commit_id> 改变版本历史,

    git cherry-pick 应用一些已经存在的改变,如: A --》 B --》C --》D --》E --》F, 现在不要D了, 步骤如下:

    1. git checkout c 会导致处于detached HEAD模式
    2. 嫁接E: git cherry-pick master^
    3. 嫁接F: git cherry-pick master
    4. 断头模式处于为命名的分支,切换回master分支: git checkout master
    5. 用匿名分支的覆盖当前master分支,相当于为master分支迁移到了刚刚的匿名分支: git reset HEAD

    git rebase 变基过程

    命令格式

    • git rebase --onto <NewBase> <since> <till> 变基过程不包含<since>包含<till>,命令执行后HEAD --> till 过程如下:
    1. git checkout <till> 处于断头模式
    2. <since>...<till> 的提交保存到临时文件
    3. git reset --hard <newbase>
    4. 将临时文件的<since>...<till>从newbase节点,逐一更改提交
    5. 若冲突则需要人工处理冲突,再决定是否变基
    6. 整个过程都在断头模式的匿名分支中,最后将匿名分支的修改,应用到要实现变基过程的分支上:git checkout master --> git reset --hard <till>
    • git rebase --onto <NewBase> <since>
    • git rebase <since> <till>
    • git rebase <since>
    • git rebase --continue 变基过程若出现冲突,解决冲突(跟新到暂存区,不提交),继续执行变基
    • git rebase --skip 跳过冲突继续变基过程
    • git rebase --abort 回滚变基过程
    • git rebase -i <since> 交互过程,可以选择要应用提交,比较直观了解。显示的信息,是在<since>节点之后的所有提交,都是基于当前分支操作,所以省去了前两种变基过程复杂的命令参数。

    之前案例的执行过程


    辅助功能

    比较工具diff

    • git diff 默认是比较work 和 index间的区别,如果执行git add之后,是看不到git diff比较的结果
    • git diff --cached 比较的是index 和 版本库间的区别,只有在git add 之后,还没commit之前能看到记录
    • git diff HEAD 工作区和版本库的比较
    • git diff HEAD^ HEAD [-- ./get_app_info/pipelines.py] 当前分支前一个版本和当前版本对比, 的某个文件, 想比较当前版本和前一个版本的去别,当前版本的参数放第二个位置

    修改已经提交的日志

    • git commit - -amend
    • git rebase -i <commit_id> commit_id可以通过git log查看

    git stash 工作区的应用

    如果接到紧急的任务,需要从一个干净的工作区开始工作,或切换到别的分支工作,需要快速保存当前尚未完成的工作进度

    1. git stash == git stash save ‘message'
    2. git checkout <new_branch>
    3. 新的工作ing, 完成后
    4. git checkout <original_branch>
    5. git stash pop

    命令

    • 显示工作区列表: git stash list
    • 删除工作区: git stash drop
    • 清空工作区: git stash clear
    • 基于进度创建分支: git stash branch <branchName> <stash>
    • git stash apply [--index] [<stash>] 如同pop,但是不删除stash list中的进度信息

    git push

    • 强推本地分支覆盖远程分支: git push -f origin master:master

    gitignore独享式

    • git config --global core.excludesfile /home/cdz/.gitignore 设置个人独享的gitignore文件
    • 或者在vi .git/info/execlude 创建文件

    文件归档

    如果用系统默认的归档工具,可能会将.git文件夹也打包进去

    • 基于最新的提交建立归档文件: git archive -o latest.zip HEAD
    • 归档个别目录: git archive -o latest.tar HEAD src doc
    • 基于里程碑v1.0建立归档,并且为归档中的文件添加目录前缀1.0: git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz

    查看相关信息命令

    • git grep "日志" 搜索版本库文件中包含日志的行
    • 显示版本库.git所在的目录: git rev-parse --git-dir
    • 显示工作区根目录: git rev-parse --show-toplevel
    • 显示相对工作区根目录的相对目录: git rev-parse --show-prefix
    • 解析引用对应的提交ID: git rev-parse master HEAD(head或refs/head/master)
    • 显示精简的修改信息: git status -s 输出格式: index work filename
    • git cat-file commit HEAD(master 66abkhde) 用于显示objects库的信息
    • git show <commit_id> 用于显示objects库的信息
    • git ls-files --with-tree=HEAD^ ls-files 用来显示index和work文件信息
    • git rev-list HEAD 查看本地提交列表
    • git ls-remote origin 查看远程提交列表
    • 文件追溯: git blame file 可以查看
    • git show-ref 查看引用列表,包含分支信息,tag信息,其实就是查看.git/refs文件的目录结构,相当于tree .git/refs

    6652a0dce6a5067732c00ef0a220810a7230655e refs/heads/master
    6652a0dce6a5067732c00ef0a220810a7230655e refs/remotes/origin/HEAD
    6652a0dce6a5067732c00ef0a220810a7230655e refs/remotes/origin/master
    c9b03a208288aebdbfe8d84aeb984952a16da3f2 refs/tags/A
    1a87782f8853c6e11aacba463af04b4fa8565713 refs/tags/B

    • heads/ 存放的是分支
    • remotes/ 存放的远程分支
    • tags/存放的里程碑
    • git cherry -v origin/master~1 查找比上流分支更新的提交
    • git

    git log命令

    • git log HEAD 只能查看当前分支日志
    • git log XXX 可以查看其它分支的日志

    git clean 清除工作区中未追踪的文件,会删除没被追踪的文件

    • git clean -nd 测试真正执行git clean命令会删除哪些目录
    • git clean 最好别用

    磁盘空间清理

    • git fsck 查看暂存区,引用游离的对象(这些游离的引用一般是有,已经add到暂存区,但是还没提交到版本库)
    • git prune 清除暂存区游离的对象,节省空间
    • 如果将错误的文件提交到版本库,通过 git reset --hard 回退版本 ,文件的引用还可以在reflog中找到引用,git prune无法清除,需要以下步骤才能清除:
    1. git reflog expire --expire=now --all now是一个日期,强制让now之前的记录全部过期,相当于清空reflog
    2. git prune 清理

    复制本地git版本库

    • git clone ./demo demo1

    将远程仓库的特定分支拉到本地

    • git pull origin master

    相关文章

      网友评论

          本文标题:git 常用命令集

          本文链接:https://www.haomeiwen.com/subject/ijtkchtx.html