Git使用手册

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 命令提示的两种方法:

  1. 直接修改文件内容,add/commit;
  2. 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的区别

  1. untrack 表示是新文件,没有被add过,是为跟踪的意思。
  2. 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。

参考链接 Git 傻瓜教程
原文地址:https://www.cnblogs.com/jooy/p/13820349.html