Git常用命令总结

这可能是东半球最详细的Git命令总结了:-)

  1. Git使用教程——《Pro Git》
  2. Git视频教程人人都会用git
  3. git在本地分为3个区:工作区,暂存区和本地仓库。
    Git更像是把数据看作是对小型文件系统的一组快照。每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。
  4. git中任何已提交的东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复
  5. [Git] Reset - mixed, hard and soft
  6. git pull和git fetch、git reset 和 git revert 的区别用法

一、本地操作

1.1 基础命令

命令 说明
git init [directory] 初始化git本地仓库
`git reset –hard commit-id HEAD^
git relog 查看git历史操作命令
git rm --cached file_name 删除暂存区的文件,如果暂存区的文件被修改,则需要使用-f参数
git mv file_from file_to 修改文件名
git reset HEAD filename 取消暂存的文件(丢弃git add后的文件)
git checkout . 丢弃工作区所有文件的修改
git checkout -- filename 丢弃工作区指定文件的修改( 注意文件名前的空格
git checkout HEAD . 丢弃工作区与暂存区的所有文件的修改
git checkout HEAD -- filename 丢弃总做区与暂存区指定文件的修改
git config --list 查看git的配置信息

1.2 克隆

Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。

克隆命令:git clone [email protected]:user/repo.git [local_repo_name]
clone时端口号不为默认的22时,需将命令修改为 $git clone ssh://user@host:port/user/repo.git [local_repo_name]

1.3 比较

git diff查看工作区与暂存区文件的差异
git diff --cached查看暂存区与本地仓库的文件差异
git diff HEAD查看工作区与本地仓库的文件差异

1.4 提交

git commit -m 'description'
git commit -a -m 'description'git addgit commit命令合并使用,此时会自动将已跟踪的文件加入暂存并提交
git commit --amend修改提交信息。若文件A已经提交,然后发现文件B忘记提交,可以执行git add B后执行git commit --amend,来实现A,B同时提交的效果。

1.5 储藏

命令 说明
git stash 将当前工作区内容储藏
git stash list 查看储藏的所有内容
git stash show -p stash@{n} 显示储藏内容
git stash apply 将最近储藏的文件取回到工作区,栈中仍存在该储藏文件
git stash apply stash@{n} 取出指定储藏的文件
git stash pop 应用储藏并删除栈中内容
git stash drop stash@{n} 丢弃储藏内容
git stash -u 暂存未被跟踪的文件

1.6 查看历史

命令 说明
git log 显示详细记录
git log -p -2 查看最近2次的提交信息,包括被改动的内容
git log --stat 显示每次提交的统计信息
git log --pretty=onelinegit log --oneline 简要显示提交信息
git log --graph 图形化显示分支、合并历史

`git log`输出选项
选项 说明
-n 仅显示最近的n条提交
--since, --after 仅显示指定时间之后的提交
--until, --before 仅显示指定时间之前的提交
--author 仅显示指定作者相关的提交
--committer 仅显示指定提交者的相关提交
--grep 仅显示含指定关键字的提交
--decorate 查看指针情况
-S 仅显示添加或移除了某个关键字的提交

1.7 变基

请勿在本地仓库外有副本的分支执行变基操作!
变基能够让提交历史变得更加简洁。
只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作。
git rebase master dev将dev分支内容变基到master分支上

变基前:
git branch

变基后:
git rebase

假设你希望将 client 中的修改合并到主分支并发布,但暂时并不想合并 server 中的修改,因为它们还需要经过更全面的测试。 这时,你就可以使用 git rebase 命令的 –onto 选项,选中在 client 分支里但不在 server 分支里的修改(即 C8 和 C9),将它们在 master 分支上重放:$ git rebase --onto master server client
多分支变基前:
多分支变基
多分支变基后
多分支变基结果


二、远程仓库

命令 说明
git remote 显示本地仓库关联的所有远程仓库
git remote -v 显示远程仓库的URL
git remote add local-repo-name url 关联远程仓库
git remote rm local-repo-name 取消与远程仓库的关联
git fetch remote-name 拉取远程仓库的所有分支
git push remote-name branch-name 将当前分支推送到远程分支
git remote show [remote-name] 显示指定远程仓库的详细信息
git remote rename old-name new-name 重命名远程仓库名

三、分支

3.1 基础命令

命令 说明
git branch branch-name [commit-hash] 新建分支
git checkout branch-name 切换分支
git checkout -b branch-name 新建并切换到新分支
git branch 查看本地分支
git branch -r 查看远程分支
git branch -a 查看所有分支
git branch -d branch-name 删除分支
git merge branch-name 合并分支到当前分支
git branch --merged 查看已经合并分支
git branch --no-merged 查看尚未合并的分支
git branch -v 查看分支的最后一次提交
git branch -vv 查看本地分支的跟踪分支, 示例点此
git push origin test:master 本地分支test推送给远程master分支(若master不存在,则自动创建)
git push origin :testgit push origin --delete test 删除远程test分支

## 3.2 分支合并 分支合并时直接会将内容覆盖

分支合并


## 3.3 分支冲突 仅当修改**同一文件的同一区域**的时候才会产生冲突,git无法执行“快速合并”(如下图)的合并就可能产生冲突

分支冲突
分支冲突解决后,需要使用git addgit commit命令再次提交


>由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此的简单能不快吗?

四、Github中的项目地址

  • HTTPS形式:https://github.com/<user>/<project_name>
  • SSH形式:[email protected]:<user>/<project_name>
  • 通常对于公开项目可以优先分享基于 HTTPS 的 URL,因为用户克隆项目不需要有一个 GitHub 帐号。 如果你分享 SSH URL,用户必须有一个帐号并且上传 SSH 密钥才能访问你的项目。 HTTPS URL 与你贴到浏览器里查看项目用的地址是一样的。

五、使用Git Hooks实现项目自动部署

YouTube视频教程:Git deploy to staging server using post-receive hook
Auto-Buffer Options

git钩子教程:Git钩子

第一步:在服务器上创建一个git裸仓库

$ sudo git init --bare sample.git #创建一个名为sample的git裸仓库

第二步:配置裸仓库下的hooks文件夹的下post-receive(若该文件不存在请手动创建),配置内容为:

1
2
#!/bin/sh
GIT_WORK_TREE=/home/wwwroot/wxsxy/wxsxy git checkout -f # 此处设置你要部署的项目目录即可

然后为此脚本赋予可执行权限chmod +x post-receive

第三步:(目前方法一存在无法推送的问题)

方法一:本地仓库关联远程裸仓库

git remote add origin ssh://[email protected]:26972/home/bare.git(端口号非默认22的情况 )
然后本地仓库中代码编辑完成后推送至远程裸仓库,裸仓库会自动将代码部署到服务器的项目地址下
git push origin master

方法二:git clone裸仓库(克隆自动关联),然后在裸仓库中添加代码推送即可


六、git的配置

设置用户名与邮件地址

1
2
$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]

查看配置信息
git config --list
git别名设置

1
2
3
4
5
6
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'
$ git config --global alias.last 'log -1 HEAD'
因为热爱,所以执着。