这可能是东半球最详细的Git命令总结了:-)
- Git使用教程——《Pro Git》
- Git视频教程人人都会用git
- git在本地分为3个区:工作区,暂存区和本地仓库。
Git更像是把数据看作是对小型文件系统的一组快照。每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。- git中任何已提交的东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用
--amend
选项覆盖的提交也可以恢复- [Git] Reset - mixed, hard and soft
- 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 add
与git 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=oneline 或 git log --oneline |
简要显示提交信息 |
git log --graph |
图形化显示分支、合并历史 |
选项 | 说明 |
---|---|
-n |
仅显示最近的n条提交 |
--since , --after |
仅显示指定时间之后的提交 |
--until , --before |
仅显示指定时间之前的提交 |
--author |
仅显示指定作者相关的提交 |
--committer |
仅显示指定提交者的相关提交 |
--grep |
仅显示含指定关键字的提交 |
--decorate |
查看指针情况 |
-S |
仅显示添加或移除了某个关键字的提交 |
1.7 变基
请勿在本地仓库外有副本的分支执行变基操作!
变基能够让提交历史变得更加简洁。
只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作。git rebase master dev
将dev分支内容变基到master分支上
变基前:
变基后:
假设你希望将 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 :test 或 git push origin --delete test |
删除远程test分支 |
## 3.2 分支合并 分支合并时直接会将内容覆盖
## 3.3 分支冲突 仅当修改**同一文件的同一区域**的时候才会产生冲突,git无法执行“快速合并”(如下图)的合并就可能产生冲突
分支冲突解决后,需要使用git add
和git 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 |
|
然后为此脚本赋予可执行权限chmod +x post-receive
第三步:(目前方法一存在无法推送的问题)
方法一:本地仓库关联远程裸仓库
git remote add origin ssh://[email protected]:26972/home/bare.git(端口号非默认22的情况 )
然后本地仓库中代码编辑完成后推送至远程裸仓库,裸仓库会自动将代码部署到服务器的项目地址下git push origin master
方法二:git clone裸仓库(克隆自动关联),然后在裸仓库中添加代码推送即可
六、git的配置
设置用户名与邮件地址
1 | $ git config --global user.name "John Doe" |
查看配置信息git config --list
git别名设置
1 | $ git config --global alias.co checkout |