Git 命令个人总结

题外话:
       git命令真的很多,这里也只是列举了一些常用的,后边的注释很重要,耐心看会看到不同及规律。

热热身:
  1. 文件状态说明:新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。
  2. vi保存退出命令:i:进入insert模式;q:退出; w:保存; wq:保存退出; q!:不保存强制退出; 对了,在输入vi命令前,别忘了先输入英文冒号 ":" 。
长姿势:
  • git 查看/修改用户名、邮箱:

    1. 查看用户名和邮箱地址:
      git config user.name
      git config user.email

    2. 修改用户名和邮箱地址:
      git config --global user.name "username"
      git config --global user.email "email"

  • git 保存密码:

    1. 设置记住密码(默认15分钟):
      git config --global credential.helper cache

    2. 如果想自己设置时间,一个小时之后失效:
      git config credential.helper 'cache --timeout=3600'

    3. 长期存储密码:
      git config --global credential.helper store //长期存储密码

  • git 修改网络代理:

    git config --global http.proxy http://10.133.130.53:809
    git config --global https.proxy https://10.133.130.53:809
    git config --global http.proxy 'socks5://127.0.0.1:1070'
    git config --global https.proxy 'socks5://127.0.0.1:1070'

  • git 查看、取消代理:

    git git config http.proxy //或 git confighttps.proxy
    git config --global --unset http.proxy
    git config --global --unset https.proxy

  • git 创建SSH的RSA秘钥对:

    // 生成的两个非对称秘钥文件在C:\Users\Administrator.ssh
    ssh-keygen -t rsa –C “[email protected]

正餐来喽:

git init //在当前目录新建一个Git代码库,git init [project-name] 新建一个目录,将其初始化为Git代码库
git clone https://github.com/XXX/MyCs.git NewMyCs //NewMyCs是改写的本地仓库名
git add 多功能命令:可用于开始跟踪新文件,或把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态,且每次文件有改动后,都需要用其将文件放入暂存区,然后等待commit。
git status //查看哪些文件处于什么状态,git status -s 命令或 git status --short 紧凑的格式输出(只列出文件列表)
git diff //当前做的哪些更新还没有暂存,即还没有执行git add操作(详细列出代码)
git diff --staged //有哪些更新已经暂存起来准备下次提交(详细列出代码)
git diff HEAD //显示工作区与当前分支最新commit之间的差异
git commit -m "Story speed"
git commit -a -m 'new benchmarks' //-a作用:直接跳过使用暂存区域的git add操作步骤,简写方式-am
git commit -a --amend -m "xxx"//可实现在未push前,修改上次本地commit的代码及注释而不会产生新的Commit
git rm README.txt //移除某个文件,加--cached README是将其移除git跟踪或用:git reset HEAD
git clean -df //从工作目录中移除没有track的文件
git mv README.md newName.md //文件改名
git log //只倒序打印提交日志,不展示提交代码
git log -p -2 //-p:用来显示每次提交的代码的差异, -2:仅显示最近两次提交
git log --stat -2 //查看到每次提交的简略的统计信息
git log -p -2 --since=2.day --author="XXX" --grep="two" //grep:打印日志信息中包含 "two"的
git log --since="2008-10-01" --before="2008-11-01"//或--after="2008-10-01" --until="2008-11-01"
git log --pretty=oneline //获取提交历史(包括提交编号和日志),简写git log --oneline
git log --pretty=raw //会显示出关于每次提交的更多信息,简写git log --raw
git log --skip=[skip] //指定跳过前几条日志
git log --follow "filePath" //显示某个文件的版本历史及文件改名,或用 git whatchanged "filePath",注意filePath要加单、双引号
git branch //列出所有本地分支
git branch -r //列出所有远程分支
git branch -a //列出所有本地分支和远程分支
git branch -v //查看本地所有分支及各分支最后一次提交内容
git branch -d [branchname] //删除本地某个分支,-d:表示非强制删除,-D:表示强制删除,换成-dr是删除远程分支
git branch -u origin/[branchname] //修改正在跟踪的上游分支
git branch [branch-name] //新建一个分支,但依然停留在当前分支
git branch [branch-name] [tagname/commit/branchName/originBranch] //从XXX中检出一个新分支
git branch (--track) [branch] [remote-branch] //新建一个分支,与指定的远程分支建立追踪关系,--track可省略
git branch --set-upstream [branch] [remote-branch] //对现有分支建立与远程分支的追踪关系
git checkout [branchname] //切换到某个本地现有分支上
git checkout -b [branchname] [tagname/commit/branchName] //通过标签等检出一个本地新的分支
git checkout --track -b [branchName] [origin/remoteBranch] //直接检出一个关联远程分支的本地分支,--track可省略
git checkout . //恢复上一个commit的所有文件到工作区,注意末尾有个点儿
git checkout -- filename //撤消对某文件的修改,注意-- filename二者中间有空格的(回到本地最后一次提交状态)
git checkout //只撤销指定文件到指定commit时的版本,注意这里命令用的不是reset
git cherry-pick [commit] //选择一个commit(编号),合并进当前分支
git config --global alias.co checkout //为命令设置一个别名,使以后写命令方便
git merge branchName //将branchName分支合并到当前分支中
git remote -v //列出所有的远程仓库
git remote show [remote-name] //查看某一个远程仓库的更多信息
git remote add //添加远程仓库
git remote rename nameA NameB //远程仓库的重命名
git remote rm paul //远程仓库paul的移除
git remote set-url origin [url] //更换远程仓库地址
git remote rm origin //配合git remote add origin [url],也能实现更换远程仓库地址功能
git tag //列出标签
git tag -a v1.4 -m 'my version 1.4' //创建附注标签
git tag [tag] [commitId] //新建一个tag在指定commit
git show //查看标签信息与对应的提交信息;
git fetch [remote-name] //下载远程仓库的所有变动
git pull //从远程仓库中抓取与拉取,前提是有一个分支设置为跟踪一个远程分支
git push [remote-origin] [tag] //提交指定tag,git push [remote] --tags :提交所有tag
git push origin HEAD:[branch-name] //推送到远程仓库,推送分支与远程分支不同名时,origin HEAD:[branch-name]不可省略
git push --force //推送至远程仓库,远程分支与其同名时使用,--force 可简写 -f
git push [remote] --all //推送所有分支到远程仓库
git push origin --delete [branchname] //删除远程分支,或者git branch -dr [origin/branchname]
git rebase --continue/abort/skip //继续执行变基操作、终止变基、跳过某一文件继续进行
git rebase -i [startpoint] [endpoint] //合并多个commit为一个完整commit(注:该区间为前开后闭区间),endpoint默认为HEAD
git rebase -i HEAD~3 //合并后三个commit
git rebase [startpoint] [endpoint] --onto [yourBranch] //配以git checkout yourBranch和git reset --hard [newCommitId]实现将某段commit粘贴到另一个分支上
git reset [file] //将指定文件从"暂存区"中释放,使其处于unstage状态,但工作区代码不变
git reset [commit] //重置本地当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset --hard //重置暂存区与工作区,与上一次commit保持一致,效果与git checkout .类似
git reset --hard HEAD、BranchName、orign/branch//在合并有冲突时,放弃本地修改的,全部采用某个分支的
git reset --keep [commit] //重置本地当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --hard HEAD^ //与git push origin master -f搭配,实现删除最后一次远程提交功能
git reset --hard [commit] //重置本地当前分支的HEAD为指定commit,同时重置暂存区和工作区,可用于版本回退
git revert [commit] //指版本回退到指定提交之前
git revert HEAD //与git push origin master搭配,实现删除最后一次远程提交功能

虽然看着有点儿多,但很多都是有规律的,你发现了吗 ?

多么痛的领悟:
  • git rebase :
    可对某一段线性提交历史进行编辑、删除、复制、粘贴,而且在每次手动处理完冲突后,都需要执行git add file和git rebase --continue 操作,但一定要注意,不要通过rebase对任何已提交到公共仓库中的commit进行修改(因:不管是git rebase 还是git rebase ,都重置了提交的SHA-1校验,当你将本地变基后的提交推送到远端后,别人从服务器同步代码时,由于相同的内容却有不同的SHA-1校验值,因此会再此进行一次合并,于是就会有两个作者、commit信息完全相同的提交,但是SHA-1校验值不同,这无疑会带来麻烦)。

    git rebase -i 和 git rebase [startpoint] [endpoint] --onto 用法 可参考:
    https://www.jianshu.com/p/4a8f4af4e803

  • revert、reset两种版本回退命令比较 :

    1. 回退版本选点不同:若commit结点按日期顺序为 C>B>A,我们需要回退到B提交后的状态,此时,我们若是采用revert方式回退,那么我们选取的回退结点应该是C,而非B,而且出现冲突需要"手动"一个个处理,但若是采用reset方式回退版本,我们直接选中B结点即可。
    2. 保留提交记录不同:revert 会生成一次新的提交,需要填写提交注释,依然想保留该目标版本后面的版本,这种方式可以记录下这整个版本变动流程。而reset是将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。
    3. 其他开发伙伴操作:revert方式:他人正常pull代码即可;而reset方式:他人需要执行git reset --hard commitId,这里要注意commitId的选取。
  • 注意事项:
    在Git bash的控制台书写命令,需要我们注意加引号问题,如git log --follow "filePath",在Git bash控制台,我们需要给filePath明确的加上单引号或双引号,命令才能正常工作。而在cmd控制台中虽没有这个问题,但却有其他问题,如换行符默认是 ^ ,而不是\ ,这就导致我们在执行回退命令git reset --hard HEAD^ 时失效,会提示 "more?",意思是问你下一行是否需要再输入,而^ 符号就被当做换行符而被git命令忽略掉了, 解决方案如下:

    加引号:git reset –-hard “HEAD^” ;
    加一个^:git reset –-hard HEAD^^ ;
    换成~:git reset –hard HEAD~ 或者 git reset –hard HEAD~ 1(~ 后面的数字表示回退几次提交,默认是一次);

  • 此处常用快捷键:
    clear: 整理日志(cmd控制台用:cls);
    ctrl + k: 清空命令窗口中的所有日志;

查看git命令详情请跳转:

(英文): https://git-scm.com/docs
(中文): https://git-scm.com/book/zh/v2

其他:

GitLab的安装要求:http://www.cnblogs.com/gnool/p/6128546.html

gitLab使用介绍:http://www.tuicool.com/articles/mEbAZbE

快速安装 GitLab 并汉化:http://www.jianshu.com/p/7a0d6917e009?mType=Group

搭建git服务器:http://www.jianshu.com/p/ee8c379ef888

Git分支管理策略:http://www.ruanyifeng.com/blog/2012/07/git.html

gitlab的用户使用手册:http://www.tuicool.com/articles/bEz6Vf

好啦,先写到这里吧,其它的就交给聪明的你啦 !!!

你可能感兴趣的:(Git 命令个人总结)