Git资料整理
在这里,我整理的并不是很多,大家可以稍微借鉴一下就好,git命令用得好可以偷点懒罢了。
操作流程
一图胜千言,你常用的几个命令大概就是这样的。这是阮一峰给出的样子:
官方git-scm是这样的:
只表明了一般的git本地操作流程:
- 在工作目录中修改文件
- 暂存文件,将文件的快照放入暂存区域
- 提交更新,找到暂存区域的文件,将快照永久性存储到git仓库目录
命令清单
配置
.gitconfig配置文件,可以是电脑上的全局配置,或者项目目录下的项目配置git config --list
用于查看全局配置
我电脑上是log出:
credential.helper=osxkeychain
user.email=nanci_guo@xinyan.com
user.name=guonanci
push.default=matching
alias.s=status
alias.t=tag
alias.ck=checkout
alias.cm=commit
alias.ps=push
alias.pl=pull
alias.d=diff
alias.l=log
alias.rs=reset
alias.rv=revert
alias.m=merge
alias.unstage=reset HEAD --
alias.last=log -1 HEAD
url.https://.insteadof=git://
last.unstage=log -1 HEAD
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
remote.origin.url=git@gitlab.xinyan.com:spider/SDK_H5.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
你们在windows也试试,大致应该差不多
增加删除文件
# 添加指定文件/目录到暂存区
$ git add [file1] [dir1] [file2] ...
代码提交
git commit -m [msg]
是提交暂存区到仓库区,git commit [file1] [dir1] [file2] ... -m [msg]
是提交暂存区的指定文件到仓库区,git commit -a
是提交工作区自上次commit之后的变化,直接到仓库区,git commit --amend -m [msg]
是使用一次新的commit,替代上一次提交,如果代码没有任何变化,则用来改写上一次commit的提交信息,`git commit --amend [file1] [file2]是重做一次commit,并包括指定文件的新变化,其实如果不太注重commit message的话,--amend这个标志位几乎没什么用了。
分支
// 列出所有本地分支
git branch
// 列出所有远程分支
git branch -r
// 列出所有本地和远程分支
git branch -a
// 新建一个分支,但依然停留在当前分支
git branch [new-branch-name]
// 从指定分支新建一个分支,切换到新分支,与同名远程分支建立追踪关系
git checkout -b [new-branch-name] [base-branch-name:可选] && git push -u origin [new-branch-name]
// 合并指定分支到当前分支
git merge [branch-to-merge]
// 删除本地和远程的同名分支,
git branch -d [branch-name] && git push origin :[branch-name]
查看信息
// 显示有变更的文件
git status
// 显示暂存区和工作区的差异
git diff
// 显示工作区和当前分支最新commit之间的差异
git diff HEAD
// 显示指定文件的每一行代码是谁在哪个时间改过,信息有点多哦。。
git blame [file]
远程同步
// 下载远程仓库的所有变动
git fetch [remote]
// 显示所有远程仓库
git remote -v
// 显示某个远程仓库的信息
git remote show [remote]
// 增加一个新的远程仓库,并命名
git remote add [shortname] [url]
// 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
// 上传本地指定分支到远程仓库
git push [remote] --force
// 推送所有远程分支到远程仓库
git push [remote] --all
撤销
// 恢复暂存区的指定文件到工作区,我经常用
git checkout [file1] [dir1] ...
// or
git checkout .
// 重置暂存区的指定文件,与上一次的commit保持一致,但工作区不变
git reset [file]
// 重置当前分支的HEAD为指定commit,同时重置暂存区与工作区,与指定commit保持一致
git reset --hard [comit-log]
// 新建一个commit,用来撤销指定commit,后者的所有变化都被前者抵消,并且应用到当前分支
git revert [commit]
git 远程操作
git clone,git remote
// ssh,https,git,本地协议都支持,git协议下载最快
git clone [版本库url] [本地目录名:可选]
// git remote 用于管理主机名,不带选项的时候,git remote列出所有远程主机
git remote // origin
// -v 选项可以查看主机网址
git remote -v
origin git@gitlab.xinyan.com:spider/SDK_H5.git (fetch)
origin git@gitlab.xinyan.com:spider/SDK_H5.git (push)
// 克隆版本库的时候,所使用的远程主机自动被git命名为origin,如果想用其他的主机名,需要用git clone命令的-o选项指定
git remote -o jQuery htttps://github.com/jquery/jquery.git
git remote
jQuery
// 可以查看该主机的详细信息
git remote show <host-name>
// 添加
git remote add <host-name> <url>
// 删除
git remote rm <host-name>
// 改名
git remote rename <old-name> <new-name>
git fetch
一旦远程主机的版本库有了commit更新, 需要将这些更新取回本地,用到git fetch <remote-host>
git fetch命令通常用来查看其他人的进程,因为她取回的代码对你本地的开发代码没有影响。默认情况下,git fetch取回所有分支的更新。如果只想取回特定分支的更新,可以指定分支名:git fetch <remote-host> <branch-name>
。所取回的更新,需要在本地主机上用"远程主机名/分支名"的形式读取。
git pull
取回远程主机某个分支的更新,再与本地的指定分支合并git pull <remote-host> <remote-branch>:<local-branch>
。如果远程分支与当前分支合并,则冒号后面的部分可以省略:
git pull origin next
git fetch origin
git merge origin/next
在某些场合,git会自动在本地分支和远程分支之间,建立追踪关系tracking,比如在git clone
的时候,所有本地分支默认与远程主机的同名分支建立追踪关系
也允许手动建立追踪关系:git branch --set-upstream master origin/next
如果当前分支远程分支存在追踪关系,git pull就可以省略远程分支名:git pull origin
,如果当前分支只有一个追踪分支,连远程主机名都可以省略:git pull
,上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果远程主机删除了某个分支,默认情况下git pull
的时候不会在拉取远程分支的时候删除对应的本地分支,是为了防止由于其他人操作了远程主机导致git pull
不知不觉删除了本地分支,当然可以加上选项 -p
就会在本地删除远程已经删除的分支:
git pull -p
// or
git fetch --prune origin
git fetch -p
git push
用于将本地分支的更新推送到远程主机,格式与git pull
命令相仿:
git push <remote-host> <local-branch>:<remote-branch>
分支推送的顺序是<from>:<to>
,git pull
对应<remote-branch>:<local-branch>
,git push
对应<local-branch>:<remote-branch>
,如果省略远程分支名,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。git push origin master
,上面命令表示将本地的master分支推送到origin主机的master分支。
如果省略本地分支名,则表示删除指定的远程分支,等同于推送一个空的本地分支到远程分支。
git push origin :master
// or
git push origin --delete master
如果当前分之与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略:git push origin
。
如果当前分支只有一个追踪分支,那么主机名都可以省略:git push
如果当前分支与多个主机之间存在追踪关系,则可以使用-u
选项指定一个默认主机,这样后面就可以不加任何参数使用git push
了: git push -u origin master
。不带任何参数的git push
默认只推送当前分支,叫做simple方式,此外还有一种matching方式
,现在默认使用simple方式,如果要修改,采用git config --global push.default matching/simple
,还有就是不管是否存在对应的远程分支,都会推送到远程主机,需要使用 --all
选项:git push --all origin
,如果要推送标签,要加上--tags
选项:git push origin --tags
。
git 进阶
git 特点
近乎所有操作都只是本地执行
比如说要浏览项目的历史,git不需要外联到服务器去获取历史,只需要直接从本地数据库中读取。
git保证完整性
git中所有数据在存储前都计算校验和,然后以校验和来引用。意味着不可能在git不知情时更改文件内容或者目录内容。这个功能构建在git底层。是构成git哲学不可或缺的部分,如果在传输过程中丢失信息或者损坏文件,git就能发现。
git用以计算校验和的机制叫做SHA-1散列(哈希hash),他是一个由40个十六进制字符(0-9和a-f)组成字符串,基于git中文件的内容或者目录结构计算出来。
进阶部分不好整理,有点多,难度比较大,大家可以自己稍微看看我推荐的progit.zh.pdf 还有 git-scm中文文档,不过说到底git只是个工具,遇到问题可以及时解决就行。
提升效率的工具方面
其实自己手打也差不多, 可以利用之前提及的git config --list里面的alias,比如:git pl && git add . && git cm -m "commit message" && git ps
; && 符号是说上一条命令执行成功才会执行下一条
Mac上有oh-my-zsh这个很方便的命令行alias全局配置工具,还有iterm2终端app,
参考下面的文章:
item2安装及使用
oh-my-zsh安装
oh-my-zsh配置
我在项目里面配置了ci.sh 和 test.sh prd.sh 可以用于日常的提交代码,推送到test分支发布测试环境,推送到prd分支发布生产环境。windows的话推荐强大的Cygwin,这里也有一篇有关Cygwin的短文,
windows上我找到这篇文章,特别短,主要是alias方面。
不过我觉得如果你的IDE自带终端还有git操作比较方便的话还是用IDE吧,不用命令行也可以。
如果用命令行的话,推荐git-bash
,这里有篇短文,推荐一下。
参考资料
书籍 | 文档 | 链接 |
---|---|---|
progit.zh.pdf | git-scm.com/book | 阮一峰-常用git命令清单 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。