检出一个仓库
$ git clone url workspacename
$ git clone https://github.com/libgit2/libgit2 libgit
检查当前工作区文件状态
- 基本输出检查
$ git status on branch master nothing to commit, working directory clean
状态简览
$ git status -s
M README //靠右的M表示文件被修改,但是还未放入暂存区
MM Rakefile //靠左和靠右都有M,表示该文件修改了两次,一次已经进入暂存区,一次修改还未进入暂存区
A lib/git.rb // A 表示新添加的文件且已经进入暂存区,等待commit
M lib/simple.rb // M 靠左,表示该修改文件已经进入暂存区,等待commit
?? LICENSE.txt // ?? 表示新添加的未跟踪的文件
添加文件到暂存区(下次待提交列表)
$ git add path/to/file(s)
工作区哪些更新还未提交
$ git diff //比较工作区和暂存区快照之间的差异
工作区哪些更新已经暂存准备好下次提交
$ git diff --staged //查看将要提交的内容,即暂存区与工作目录head之间的差异
提交工作区的更新至本地版本库
提交时记录的是放在暂存区域的快照。一次提交操作都是对项目的一次快照。
移除文件
要从git中移除某个文件,就必须要从已跟踪的文件清单中移除(确切说,是从暂存区移除),然后提交.
$ git rm path/to/file(s) //下次提交时,该文件就不在纳入版本管理。
$ git rm -f path/to/file(s) //删除之前修改且已放入暂存区的文件。
$ git rm --cached path/to/file //将文件从已跟踪状态,变成未跟踪状态(用于解决未及时添加忽略列表,结果将中间文件受控)。
移动文件
$ git mv file_from file_to //该命令相当于:mv file_from file_ro + git rm file_from + git add file_to
常见的查看提交历史的操作
$ git log -p -n //-p 用来显示每次提交内容的差异,-n 表示显示最近n次
$ git log --stat -n //-stat 列出每次条所有被修改的文件、有多少被修改,以及修改过的文件的哪些行被移除或添加。在最后输出一次提交的一个总结。
$ git log --pretty=oneline /每个提交展示在一行
$ git log --pretty=format:"%h - %an, %ar :%s" //根据format 选项可以列出自己喜欢的日志展示模式
$ git log --pretty=format:"%h %s" --graph //可以展示你所在分支的合并历史
$ git log --since=2.weeks //限制显示两周内的日志记录
$ git log --author zhangsan //列出zhangsan的提交记录
$ git log -SstringA // -S 可以列出那些添加或移除了某些字符串的提交。
撤销操作
- 撤销已提交修改。当提交完后,发现漏提交文件或者提交日志填写有问题
$ git commit -amend //会将暂存区中的文件提交,同时跟上一次提交合并,更新上一次提交日志
撤销暂存区中的文件
$ git reset HEAD <file> //取消暂存区中file的修改
$ git rest --hard HEAD <file> //取消暂存区和工作区file的修改,使用需特别注意
撤销工作区未暂存文件修改
$ git checkout -- <file> //丢弃工作区对file的修改,使其跟head保持一直,这个过程不可逆
分支常见操作
git中的分支其实就是指向某个commit对象的可变指针,因此分支成本非常低,只要创建一个相应的指针即可。当从远端克隆一个仓库时,master作为分支的默认名字。
- 创建本地分支
$ git branch <branchname> //仅新建分支,但当前工作区还未在新分支 $ git checkout -b <branchname> // 创建并将当前工作区切换为新分支工作区 $ git checkout <branchname> //切换当前工作区至新分支,同时HEAD指向新分支标签
创建远程分支
$ git push <remote-shorthname> <branchname> //若分支需要跟其他人协作,可以将本地创建分支push到远端仓库
$ git checkout -b <branchname> <remote-shortname>/<branchname> // 将远程分支检出到本地工作区,并设置为跟踪分支
分支合并及清理分支
$ git merge <branchname> //将分支合入当前工作区分支中
$ git branch --merged/no-merged // 查看哪些分支已合入或未合入
$ git branch -d <branchname> //分支合入后,及时删除已合入的本地分支
$ git push <remote-shortname> :<branchname> //删除远程分支,使用须谨慎
$ git push <remote-shortname> [本地分支]:[远程分支] //注意跟分支删除间的差别
远程仓库使用
查看远程仓库
添加远程仓库
$ git remote add <remote-shortname> <url> //添加一个新的远程仓库,同时指定一个你可以轻松引用的简写,类似 origin
从远程仓库抓取和拉取
$ git fetch <remote-shortname> //将远程仓库中你没有的数据拉取到本地git仓库,而不是你的工作区
$ git pull //通常会从最初克隆的服务器上抓取数据并自动合并到当前所在的分支的工作区
推送提交至远端服务器
$ git push [remote-shortname] [branch-name] //当有写入权限,且服务器没有新的推送时,这个命令才可以生效
$ git pull //通常会从最初克隆的服务器上抓取数据并自动合并到当前所在的分支的工作区
远程仓库重命名和移除
$ git remote rename remote-shortnameA remote-shortnameB //将远程仓库简写名字从A改到B
$ git remote rm [remote-shortname] //将远程仓库从本地仓库记录中移除
-
标签的使用
给历史中的某一个提交打上标签,以示重要 - 查找标签
$ git tag //按照字母顺序列出标签,但标签出现的顺序并不重要 $ git tag -l 'v6.5*' //按照特定模式查找标签
创建标签
git 有两种类型的标签:轻量标签(lightweight) 和 附注标签(annotated)
轻量标签:类似一个不会改变的分支,它只是一个特定提交的引用
附注标签:推荐使用该类型标签。是存储在git数据库中的一个完整对象。包含打签名者的信息/标签信息
$ git tag -a tag_name SHA-1 -m 'tag message' //-a 是附注标签的标识。以指定hash创建一个附注标签
- 推送标签至远端服务器
$ git push <remote-shortname> [tagname] $ git push <remote-shortname> --tags //一次性推送多个标签至远端服务器
- 检出标签
git 中并不能真的检出一个标签,因为它们不能像分支一样来回移动。$ git checkout -b [branchname] [tagneme]
提示:文章来源于网络