初始化
工程初始化
- git init demo 会直接生成demo的目录
- mkdir demo && cd demo && git init
已追踪文件提交修改
- git add -u update更新已经追踪的文件,到本地仓库,相当于git add trackedFile
- git commit -m "haha" 提交
- 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修改的步骤如下:
- 替换master(refs/master 文件所指向的commit_id)
- 替换暂存区的内容
- 替换工作区的内容 (这一步比较危险,会覆盖工作区)
- 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>
- 如果没有在出现头指针的情况下,及时创建新分支,并且已经做了修改并提交,此时的提交并不会记录在之前的分支记录上,记录在断头的分支上,解决方法如下:
- 切换到要将该修改合并到哪个分支上: git checkout master
- 根据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了, 步骤如下:
- git checkout c 会导致处于detached HEAD模式
- 嫁接E: git cherry-pick master^
- 嫁接F: git cherry-pick master
- 断头模式处于为命名的分支,切换回master分支: git checkout master
- 用匿名分支的覆盖当前master分支,相当于为master分支迁移到了刚刚的匿名分支: git reset HEAD
git rebase 变基过程
命令格式
- git rebase --onto <NewBase> <since> <till> 变基过程不包含<since>包含<till>,命令执行后HEAD --> till 过程如下:
- git checkout <till> 处于断头模式
- <since>...<till> 的提交保存到临时文件
- git reset --hard <newbase>
- 将临时文件的<since>...<till>从newbase节点,逐一更改提交
- 若冲突则需要人工处理冲突,再决定是否变基
- 整个过程都在断头模式的匿名分支中,最后将匿名分支的修改,应用到要实现变基过程的分支上: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 工作区的应用
如果接到紧急的任务,需要从一个干净的工作区开始工作,或切换到别的分支工作,需要快速保存当前尚未完成的工作进度
- git stash == git stash save ‘message'
- git checkout <new_branch>
- 新的工作ing, 完成后
- git checkout <original_branch>
- 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无法清除,需要以下步骤才能清除:
- git reflog expire --expire=now --all now是一个日期,强制让now之前的记录全部过期,相当于清空reflog
- git prune 清理
复制本地git版本库
- git clone ./demo demo1
将远程仓库的特定分支拉到本地
- git pull origin master
网友评论