Git思维导图
Linux 常用命令
pwd 查看当前文件路径
- mkdir 创建目录、touch 新建文件、rm 删除文件
- 查看 readme.txt 文件内容
cat readme.txt - r 就是向下递归,不管有多少级目录,一并删除 ; -f 就是直接强行删除,不作任何提示的意思
删除目录和目录下所有文件 rm -rf [dir] ; 删除文件 rm -f xxx.log
配置基本信息
- 当前PC下所有Git仓库都会使用如下配置,也可以对某个仓库指定不同的用户和邮箱
git config --global user.name "changbao"
git config --global user.email "1772664927@qq.com" - 使当前目录变成git仓库,生成.git目录
git init
设置代理
-
设置代理
git config --global http.proxy http://proxy.com:1234
git config --global https.proxy http://proxy.com:1234
git config --global http.sslverify false -
禁用代理
git config --global --unset http.proxy
git config --global --unset https.proxy -
检查当前代理
git config --global --get http.proxy
git config --global --get https.proxy
版本回退
git reset --hard HEAD^
git reset --hard HEAD^^
git reset --hard HEAD^^^
git reset --hard HEAD~100
Tips : 先用 git reflog 查看版本号
eg: 435ccc9 HEAD@{2}:commit:增加666
再执行 git reset --hard 版本号(435ccc9)
工作区与暂存区
- 工作区:操作文件的目录;
- 版本库:工作区中的 .git 隐藏目录,它不属于工作区。其中最重要的就是
stage(暂存区)。还有git自动创建的第一个分支master,以及指向master'的一个
指针HEAD。
增加/删除文件
- 添加指定文件到 暂存区
git add file1 file2 ... - 添加指定目录到 暂存区
git add [dir] - 添加当前目录所有文件到 暂存区
git add . - 添加每个变化前,都会要求确认
- 对于同一个文件的多处变化,可以实现分次提交
git add -p - 把文件同时从删除 工作区 和 暂存区删除
git rm file1 file2 - 停止追踪指定文件,但该文件会保留在 工作区
git rm --cached file - 改名文件,并且将这个文件放入暂存区
git mv oldFile newFile
代码提交
- 提交暂存区到仓库区并添加注释
git commit -m "提交 readme.txt" - 提交暂存区指定文件到仓库区
git commit file1 file2 ... -m "提交file1和file2" - 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a - 提交时显示所有diff信息
git commit -v - 使用一次新的commit,替代上一次提交 ? what ?
- 如果代码没有任何新的变化,则用来改写上一次commit的提交信息
git commit --amend -m "提交啦" - 重做上一次commit,并包括指定文件的变化
git commit --amend file1 file2
分支
- 创建并切换分支
git checkout -b dev - 列出所有本地分支
git branch - 列出所有远程分支
git branch -r - 列出所有本地分支 + 远程分支
git branch -a - 切换分支,并更新工作区
git checkout dev - 新建分支,但依然停留在当前分支
git branch feature/001 - 新建分支,并切换到该分支
git checkout -b feature/001 - 新建一个分支,指定提交:
git branch [branch] [commit] - 新建一个分支,与指定的远程分支建立追踪关系 ※
git branch --track [branch] [remote-branch] - 建立追踪关系,在现有分支与指定的远程分支之间 ※
git branch --set-upstream dev origin/dev - 切换到上一分支
git checkout - - 选择一个commit,合并进当前分支
git cherry-pick [commit] - 删除分支
git branch -d feature/001 - 删除远程分支
git push origin --delete feature/001
git branch -dr feature/001 - 在master上合并dev分支的内容
git merge dev
git branch -d dev - 终止 merge
git merge --abort - 分支管理策略
通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff 来禁用”Fast forward”模式。
git merge --no-ff -m "merge with no-ff" dev
git branch -d dev 最后在查看历史记录,发现被删除的分支信息还在
- 查看历史记录
git log --graph ;
git log --graph --pretty=oneline --abbrev-commit - bug分支、stash功能
git stash - 查看stash记录
git stash list - 恢复/删除
git stash apply 恢复,git stash drop 删除 ,git stash pop 恢复+删除
刚才执行了 git stash 命令,把之前写的东西隐藏了起来,现在去创建新的 issue-404 分支修复bug,然后再把内容恢复回来。
标签Tag (略)
查看记录
- 显示有变更的文件,commit之前之后都调一次
git status - 显示当前分支的版本历史
git log - 显示commit历史,以及每次commit发生变更的文件
git log --stat - 根据关键字搜索提交历史
git log -S [keyword] - 显示某个文件的版本历史,包括文件改名
git log --follow file1 ;
git whatchanged file1 - 查看对 readme.txt 文件修改的历史记录,从近到远显示日志
git log
git log --pretty=oneline
显示最近五次提交
git log -5 --pretty=oneline 等价于 git log -5 --pretty --oneline - 显示指定文件是什么人在什么时间修改过
git blame file1 - 显示暂存区和工作区的差异
git diff - 查看 readme.txt 改变了哪些内容
git diff readme.txt - 显示工作区与当前分支最新commit之间的差异
git diff HEAD - 显示今天你写了多少行代码
git diff --shortstat "@{0 day ago}" - 显示当前分支的最近几次提交
git reflog
远程同步
- 下载远程仓库的所有变动
git fetch [remote] - 显示所有远程仓库
git remote -v - 显示某个远程仓库的信息 - ?失败?
git remote show [remote] - 增加新的远程仓库,并命名
git remote add feature/001 xxx.git - 取回远程仓库的变化,并与本地分支合并
git pull origin dev - 上传本地分支到远程
git push origin dev - 强行推送当前分支到远程仓库,即使有冲突
git push origin --force - 推送所有分支到远程仓库
git push [remote] --all
git push origin --all
撤销修改
- 恢复暂存区的指定文件到工作区
git checkout -- file1 - 恢复暂存区所有文件到工作区
git checkout . - 重置暂存区与工作区,与上一次commit保持一致
git reset --hard - 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit] - 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit] - 新建一个commit,用来撤销指定commit
- 后者的所有变化都将被前者抵消,并且应用到当前分支
git revert [commit]
当 readme.txt 文件中有问题未提交之前,git status 命令提示的两种方法:
- 直接修改文件内容,add/commit;
- git checkout -- readme.txt 会丢弃掉工作区的修改,优先从 暂存区 里拿
- readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。
- 另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
删除文件
touch b.md -> git add b.md -> git commit -m "Add b.md" -> rm b.md
-> git status 显示 deleted: b.md
此时b.md已从工作区删除但仍存在于stage(暂存区),可通过:
-
恢复文件到工作区
git checkout -- b.md 恢复文件到工作区
如果从暂存区删除,在rm 之后调用 : git commit - a 之后会提示提交 message的vim窗口。或者:git commit -a -m "重命名 Git常用命令.md" -
git清除本地缓存(改变成未track状态),然后再提交:
git rm -r --cached . -
删除多提交的目录,比如.idea,build文件夹:
$ git pull origin master 将远程仓库里面的项目拉下来
$ dir 查看有哪些文件夹
$ git rm -r --cached .idea 删除.idea文件夹
$ git commit -m '删除了.idea' 提交,添加操作说明
$ git push -u origin master 将本次更改更新到github项目上去
操作完成.
多人协作
- 查看远程仓库信息
git remote 加上 -v 查看详细信息 - 创建本地dev分支 + 从远程检出dev分支
git checkout -b dev origin/dev
修改内容后
git pull origin dev , git push origin dev - git pull 失败,可能是没有指定本地dev分支与远程origin/dev分支的链接,根据提示
设置dev origin/dev 的链接:
git branch --set-upstream dev origin/dev ;
git pull
如果GitHub上新建的仓库为空
目前,在GitHub上的这个testgit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的testgit仓库下运行命令:
git remote add origin https://github.com/javakam/gitpractice.git
把本地仓库的 master 分支推到远程仓库 ,第一次加上 -u
由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master
git库所在的文件夹中的文件大致有4种状态
-
Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
-
Unmodify:
文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,
而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件 -
Modified:
文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态,
使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 -
Staged:
暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态.
执行git reset HEAD filename取消暂存, 文件状态为Modified -
Git 状态 untracked 和 not staged的区别
- untrack 表示是新文件,没有被add过,是为跟踪的意思。
- not staged 表示add过的文件,即跟踪文件,再次修改没有add,就是没有暂存的意思
每次开发完新feature之后
git pull origin develop
git push origin feature/dialog
After PR merged :
git branch -dr feature/dialog
push之后,GitHub上会有黄色提示窗提示Pull Request,提完PR后如果没问题,
直接merge,若需要review时候,可直接在review上修改,也可以在IDE上修改之后
再次执行上面的拉取和推送操作,此时不会创建新的PR。