Git Note
Git
文件状态
Git目录: (git directory),亦即Git仓库,一般对应项目根目录下的.git目录。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
工作目录:(working directory)是项目某个版本的签出(The working directory is a single checkout of one version of the project) ,也就是本地项目目录,其包含该版本的所有文件(不包括Git目录)。这些文件都是从Git目录中取出的,我们可以在工作目录中修改它们(modify)、删除它们(remove)或添加新文件(add)——这些称之为改动(Changes)。
暂存区域:(staging area)是工作目录和Git目录之间的临时中转区,存储着工作目录中部分改动文件的快照,该快照将在下次提交时被永久地保存到Git目录中。暂存区域也叫索引(index),实际是Git目录下的index文件(
.git/index
),其存放了与当前暂存内容相关的信息,包括暂存的文件名、文件内容的SHA-1哈希值和文件访问权限,使用git ls-files --stage
命令可查看其内容。
初始化
查看配置信息
git config --list
git config [--system/--global/--local] user.name
初始化新仓库
git init
从现有仓库克隆
从现有的项目仓库(如远程服务器上自己的项目,或者其它某个开源项目)克隆到本地,Git接收的是项目历史的所有数据(包括每一个文件的每一个版本)。
git clone <repo> [<dir>]
克隆时可以在上面的命令末尾指定新的名字,来定义要新建的项目目录名称(仅目录名称不同),例如:
git clone git@github.com:jquery/jquery.git myjquery
Git支持git://
,http(s)://
,ssh://
等多种数据传输协议。
Git的基本工作流程
改动文件:在工作目录中修改、删除或添加某些文件
暂存文件:对改动后的文件进行快照,保存至暂存区域
提交快照:将保存在暂存区域的文件快照永久转储到Git目录中
查看工作目录下当前文件的状态
git status
暂存文件
其作用是把目标文件快照放入暂存区域(add file into staged area)。
命令 | 新文件 | 被修改文件 | 被删除文件 |
---|---|---|---|
git add |
Y | Y | N |
git add -u |
N | Y | Y |
git add -A |
Y | Y | Y |
取消已修改或已暂存文件
git checkout [<commit>] [--] <file>...
省略commit: 暂存区域 覆盖工作目录 的文件
指定commit: 指定commit 覆盖暂存区域和工作目录
两者不会改变HEAD指针,其中--用于分隔指定文件,防止该文件与分支重名造成分支误操作。
$ git checkout -- grep.py # 放弃grep.py文件未暂存的改动
$ git checkout . # 放弃所有未暂存的改动
$ git checkout HEAD *.txt # 放弃本次所有txt文件作的改动(包括工作目录和暂存区域)
$ git checkout HEAD . # 放弃所有已暂存改动和未暂存改动,即完全重置到最近的提交状态
文件重置为最近提交时的状态
git reset HEAD <file>
从暂存区域移除文件
git rm --cached <file>
差异比较
命令 | 描述 |
---|---|
git diff |
工作目录 / 暂存区域快照 |
git diff [--] <path>... |
工作目录 / 暂存区域快照(指定文件或目录) |
git diff --cached |
暂存区域快照 / 上次提交 |
git diff --cached [--] <path>... |
暂存区域快照 / 上次提交(指定文件或目录) |
git diff HEAD |
工作目录 / 上次提交 |
git diff <commit> |
工作目录 / commit |
git diff <commit> [--] <path>... |
工作目录 / commit(指定文件或目录) |
git diff --cached HEAD |
暂存区域快照 / 上次提交 |
git diff --cached <commit> |
暂存区域快照 / commit |
git diff --cached <commit> [--] <path>... |
暂存区域快照 / commit(指定文件或目录) |
git diff <commit1> <commit2> |
commit1 / commit2 |
git diff --check |
列出所有的尾随空白符 |
提交快照
把暂存区域内的文件快照提交至Git目录中:
git commit -m "Fix Bug #182: Fix benchmarks for speed"
把所有已经跟踪过的文件暂存起来一并提交:
git commit -a -m "added new benchmarks"
以新作者提交:git commit --author wjhook<wjhook@gmail.com>
将指定文件和已暂存文件一并提交:git commit -i <file>...
只提交指定文件:git commit -o <file>...
修改最后一次提交:
- 重新编辑提交说明:
git commit --amend -m <message>
- 重新编辑提交作者:
git commit --amend --author wjhook<wjhook@gmail.com>
Git的基本工作扩展
查看提交历史
git log --pretty=format:"%h [%an]<%ae>(%ad) message -> %s" --after="2016-08-12 15:26:00" --before="2016-08-25" --graph --author= wangjie -p -- *android/alibaba/member*FragmentMemberSignIn.java -3
按照"hash [作者]<邮箱>(时间) message -> 提交说明"的格式查看提交时间在2016-08-12 15:26:00 ~ 2016-08-25 之间的、作者为wangjie的关于*android/alibaba/member*FragmentMemberSignIn.java
文件的log并显示提交差异。
%H :提交对象(commit)的完整哈希字串
%h :提交对象的简短哈希字串
%an:作者(author)的名字
%ae:作者的电子邮件地址
%ad:作者修订日期(可以用 -date= 选项定制格式)
%ar:作者修订日期,按多久以前的方式显示
%s:提交说明
git log --diff-filter=[A/D] --summary
:
列出版本库中曾添加/删除过文件的提交
git log --diff-filter=[A/D] --summary | grep create
:
列出所有添加/删除过的历史文件
git log branch1..branch2
:属于branch2,不属于branch1的提交
暂存栈
-> stash@{0/1/2/3...}
git stash [save <message>]
: 当前工作保存到暂存栈中
git stash pop [<stash>]
: 恢复暂存栈中引用为的工作,并从暂存栈中删除
git stash apply [<stash>]
: 恢复暂存栈中引用为的工作,暂存栈中不删除
git stash drop [<stash>]
: 删除暂存栈中引用为的工作
git stash list
: 列出暂存栈中的所有工作
git stash show [<stash>]
: 显示暂存栈中引用为的工作的改动记录
git stash clear
: 清除暂存栈中所有保留的工作
git stash branch <branchname> [<stash>]
: 基于指定工作创建新分支,完全恢复该工作被保存前的状态(新建一个最新提交为创建时所在的提交、名为的分支,同时切换到该分支,恢复暂存栈中引用为的工作,并将其从暂存栈中删除)
删除文件
rm <file>...
:从工作目录中删除指定文件,但不从暂存区域移除
git rm <file>...
:从工作目录中删除指定文件,同时将其从暂存区域移除
git rm --cached <file>...
:仅仅将文件从暂存区域中移除(其状态变为未跟踪),不对该文件进行其它操作
git rm -f <file>...
:强制删除
git rm -r <file>...
:递归删除(用于删除目录)
移动或重命名文件
git mv <file_from> <file_to>
其等价于
$ mv <file_from> <file_to>
$ git rm <file_from>
$ git add <file_to
清除未跟踪文件
git clean -n
: 显示将要清除的文件和目录
git clean -f
:强制清除文件(不包括目录)
git clean -df
:强制清除所有文件和目录
若要同时再移除被忽略的文件或目录,加上-x参数;若只移除被忽略的文件或目录,加上-X参数。
合并
git merge -m <msg> <commit>
:如果产生新的合并提交,则附加msg说明
git merge --no-commit <commit>
:合并成功后不会自动产生新的提交,用户可以在下次提交前对这次的合并结果进行修改和调整
git merge --abort
:遇到合并冲突时,此命令将终止合并,并恢复未合并之前的状态
分支挑捡
如果不需要合并某个分支的全部提交,而只需要该分支的某个或某些提交,使用git cherry-pick命令,它会将指定的commit重新应用到当前分支,命令格式为:
$ git cherry-pick <commit>...
远程交互
查看远程仓库
git remote
加上-v
选项,显示对应的克隆地址:git remote -v
添加远程仓库
git remote add <shortname> <url>
git remote add upstream https://github.com/xgenvn/InputHelper.git
拉取所有xgenvn有的,但本地仓库没有的信息
git fetch upstream
git remote rename <old> <new>
:重命名远程仓库
git remote rm <name>
:删除名为name的远程仓库
git remote [-v] show <name>
:查看远程仓库信息
git remote prune <name>
:删除不存在对应远程分支的本地分支
推送提交到远程仓库
git push <remote> <branch>
git push <remote> <lbranch>:[<rbranch>]
:将本地lbranch分支推送到remote远程仓库的rbranch分支。若rbranch缺省则默认为lbranch,等同于git push
git push <remote> :<branch>
:将空推送到remote远程仓库的branch分支,即删除remote远程仓库的branch分支
git push <remote> --delete <branch>
:删除remote远程仓库的branch分支
git push <remote> -f <lbranch>:[<rbranch>]
:将本地lbranch分支强制推送到remote远程仓库的rbranch分支
从远程仓库拉取最新改动
基本命令为git fetch
,其作用是到远程仓库中拉取所有本地仓库中还没有的最新改动,但不会自动将这些改动合并到当前工作分支
git fetch [<remote>]
:到remote远程仓库拉取所有本地仓库中还没有的最新改动,不指定remote则默认为origin
git fetch <remote> <branch>
:将remote远程仓库的branch分支拉取到本地,同时用FETCH_HEAD指针指向它
git fetch --all
:拉取所有远程仓库
git fetch -p
:删除不存在对应远程分支的本地分支
从远程仓库拉取最新改动并合并
基本命令为git pull
,其作用是从远程仓库自动拉取最新改动到本地(Fetch),然后将远程分支自动合并到本地仓库中的当前分支(Merge)
git pull <remote> <branch>
其将remote远程仓库的branch分支拉取到本地,然后将其合并到本地当前分支。
git pull <remote> <rbranch>:<lbranch>
:将remote远程仓库的rbranch分支拉取到本地,然后将其合并到本地lbranch分支
重置
基本命令为git reset,其作用是将当前分支指针(HEAD指针)重置为指定状态
git reset [<commit>] [--] <paths>...
将暂存区域中指定路径的文件重置为指定commit(不指定则默认为HEAD)时的状态,但不会改变工作目录及当前分支,其相当于git add 的反向操作。该命令执行后,自从commit以来指定文件的所有改动都显示在Changes not staged for commit中,而这些改动的反向改动会显示在Changes to be committed中。
git reset (--soft|--mixed|--hard) [<commit>]
Git Note的更多相关文章
- Git Note - Branch
1. add a new branch cd workspace git branch user1/newbranch1 git checkout user1/newbranch1 or git ch ...
- Git Note - git tag
git tag is used to create labels, usually for version numbers. Format: git tag <TagName> <r ...
- Git - Tutorial [Lars Vogel]
From: http://www.vogella.com/tutorials/Git/article.html Git - Tutorial Lars Vogel Version 5.6 Copyri ...
- Git工作流指南:Gitflow工作流 Comparing Workflows
Comparing Workflows The array of possible workflows can make it hard to know where to begin when imp ...
- git使用ssh协议,生成公钥和私钥,并指定私钥
http://superuser.com/questions/232373/how-to-tell-git-which-private-key-to-use In ~/.ssh/config, add ...
- git workflows
https://www.atlassian.com/git/tutorials/comparing-workflows Comparing Workflows The array of possibl ...
- how to install git 1.8 rpm
git版本在低于1.8之前,对于私有项目会出现401的pull失败错误,只能通过升级git版本来解决 It appears that git18 is no longer available from ...
- linux git升级到1.8.3
1. Download PUIAS repo: wget -O /etc/yum.repos.d/PUIAS_6_computational.repo https://gitlab.com/gitla ...
- How To Use Git Source Control with Xcode in iOS 6
This tutorial is by Malek Trabelsi, a passionate iOS developer from Tunisia focused primarily on mob ...
随机推荐
- 用Jetty 9.1运行Java WebSockets微服务
Jetty 9.1的发布将Java WebSockets (JSR-356) 带入了非Java EE环境,从而开启了微服务时代.我们可以将Jetty的容器包含在java应用程序中(注意,不是Java代 ...
- redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?
转载:https://blog.csdn.net/wab719591157/article/details/73379844 redis 中存数据时,到底什么时候用 hset 相比于 set 存数据 ...
- android中使用spinner组件
spinner组件类似于html中的select标签,实现下拉选择框的功能. 添加一个Activity,界面上添加一个spinner下拉框,一个button按钮.点击按钮,获取spinner下拉框当前 ...
- WinForm 之 应用程序开机自启动设置方法
一.原理 需要开机自启动的程序,需要将其启动程序的路径写到注册表中指定的文件夹下. 二.实现方式 方法1:在生成安装程序时配置: 方法2:在程序运行时动态配置. 三.在生成安装程序时配置 1.右击安装 ...
- LoadRunner基于HTML-based script和URL-based script方式录制的区别和各自的使用场景
一.区别: 为了更加直观的区别这两种录制方式,我们可以分别使用这两种方式录制同一场景(打开百度首页)然后进行对比,录制的代码如下: HTML-based script方式打开百度首页: Action( ...
- 动态加载jar包(一)
一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ( ...
- Linux安装nginx并设置https(openssl
一.安装依赖包 1.$sudo apt-get install openssl 或者$sudo apt-get install libssl-dev 2.$sudo apt-get instal ...
- openerp 7.0邮件多用户发送失败问题 解决方法
方法一(推荐): 修改代码/usr/lib/pymodules/python2.7/openerp/addons/base/ir/ir_mail_server.py #425 line: #mail_ ...
- excel 上标和下标
开始--字体--设置单元格格式--上标/下标
- python之函数用法startswith()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法startswith() #http://www.runoob.com/python/ ...