风之旅人 Android Dev Engineer

Git使用指南

2019-12-01
git

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 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 傻瓜教程

上一篇 ADB调试工具

评论