资料整理
笔记 摘自上面的资料#
Git 基础知识
Git 数据的可靠性是靠文件的校验和做到的。
Git 三种状态: 已提交( committed ) 、已修改(modified)、已暂存(staged)。
已提交表示数据已经安全的保存在本地数据库中
Git管理版本差异,并不是像其它系统那样保存一组基本文件和每个文件虽时间逐步基类的差异,而是采用快照的形式。Git在你提交更新或保存项目状态时,对当时全部文件制作一个快照并保存这个快照的索引。如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接,来指向之前存储的文件。
Git 基础操作
概念: 仓储(repertory), 跟踪(track), 暂存(stage), 提交(commit), 推送(push), 拉取(pull)
获取Git仓库
- 在工程目录初始化 Git 仓库:
$ git init
- 追踪工程文件,并提交:
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
- 上传到GitHub
$ git remote add origin https://github.com/chlq/javaStudy.git
$ ##git remote set-url origin https://github.com/chlq/javaStudy.git
$ git push origin
- 克隆现有的仓库
当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来.
克隆仓库的命令格式为
$ git clone [url]
$ git clone https://github.com/chlq/XChart
$ $ git clone https://github.com/chlq/XChart myXChart
这会在当前目录下创建一个名为 “XChart” 的目录,并在这个目录下初始化一个 .git 文件夹
而第二个名字会创建 名字为 'myXChart' 的目录
更新到仓库
- 检查当前文件状态
$ git status
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
无文件要提交,干净的工作区
$ echo 'study how to use git' > studyGit
$ git status
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
studyGit
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
未跟踪(untracked) 意味着 仓库之前的快照中没有这个文件;Git也不会自动降至纳入跟踪范围,说白了就是在仓库中是黑户,未登记.虽然冷冻室里偶尔会有老鼠, 但是食物登记上可没有, 管理系统(Git)也不会主动添加上来
- 跟踪新文件
$ git add studyGit
$ git status
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
新文件: studyGit
这时该文件处于 暂存状态( staged); 另外 git add 以目录为参数,则会递归跟踪该目录下的所有文件.
- 暂存已修改文件
$ echo 'test' >> CONTRIBUTORS
$ git status
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
新文件: studyGit
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: CONTRIBUTORS
$ git add CONTRIBUTORS
$ git status
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: CONTRIBUTORS
新文件: studyGit
git add 应当利皆为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”. 另外 提交时只提交暂存区里的变更,已更改但未暂存的不会提交.
- 其他
$ git status -s ## 简略信息
M CONTRIBUTORS
A studyGit
$ cat .gitignore ## 忽略的文件, 正则表达式
$ git diff
- 提交更新
$ git commit
$ git commit -m "This is a git commit test."
$ git commit -a -m "can commit all file that tracked"
Git - 分支
每次提交对象会包含一个指向上次提交对象(父对象)的指针,提交的信息,作者及邮箱等。
分支其实就是指向其中一个对象的指针。
$ git branch testing ##在当前所在的提交对象上创建一个testing分支指向该对象。
##一直指向当前所在提交对象的指针叫 HEAD
$ git log --oneline --decorate ## 查看个分支当前的对象
$ git checkout testing ## 这样当前分支HEAD就切换到testing分支了
$ git log --oneline --decorate
d62d657 (HEAD, origin/develop, origin/HEAD, develop) study git commit you can de
$ touch gittestfile
$ echo "git testing branch" >> gittestfile
$ git add gittestfile
$ git commit -a -m 'branch testing'
[testing e077c17] branch testing
2 files changed, 2 insertions(+)
create mode 100644 gittestfile
$ git log --oneline --decorate
e077c17 (HEAD, testing) branch testing
d62d657 (origin/develop, origin/HEAD, develop) study git commit you can deal it
$ git checkout -b iss53
## 与下面两条等效
$ git branch iss53
$ git checkout iss53
# git branch -d testing ##删除分支testing
本地分支合并
想要将分支iss53合并到master分支上
$git checkout master
$git merge iss53
$git branch -d iss53
远程分支
阮一峰的网络日志-Git远程操作详解
阮一峰老师的日志写的非常条理清晰易懂
远程分支(remote branch)是对远程仓库中的分支的索引。远程分支本地可以查看但是无法移动,只有在进行网络交互时才会更新。
当你git clone 远端Git服务器里的代码时,Git自动将此远程仓库命名为origin, 并建立一个指向该仓库master分支的指针: origin/master
# 设置远程仓库名
$ git clone -o 希望的仓库名 远程git URL
# 通过 git branch 可以查看当前本地分支
➜ git:(chlq_cases) ✗ git branch
* chlq_cases
master
# 通过 git branch -r 查看远程分支
➜ git:(chlq_cases) ✗ git branch -r
origin/HEAD -> origin/master
origin/chlq_cases
origin/dev
origin/master
# 从远程分支创建新的本地分支
git checkout -b newBrach origin/master
# 与本地分支合并类似
git merge origin/master # 可以在当前本地分支上,合并origin/master
# 删除远程分支
git branch -r
git branch -r -d origin/xxxx
git remote
$ git remote -v
origin ssh://git@git.xxx.com/~chenlanqiang/waimai-money-app-uitest.git (fetch)
origin ssh://git@git.xxx.com/~chenlanqiang/waimai-money-app-uitest.git (push)
$ git remote set-url origin ssh://git@git.xxx.com/~chenlanqiang/waimai_m_app_uitest_money.git
$ git remote -v
origin ssh://git@git.sankuai.com/~chenlanqiang/waimai_m_app_uitest_money.git (fetch)
origin ssh://git@git.sankuai.com/~chenlanqiang/waimai_m_app_uitest_money.git (push)
git fetch
git fetch命令用于从另一个存储库下载对象和引用。
git refspec 详解
# 同步 远程仓库 中的数据 到 本地
$ git fetch <远程仓库名>
# 同步 远程仓库 制定分支 的数据 到 本地
$ git fetch <远程仓库名> <分支名>
# 同步 远程仓库origin 的master分支 的数据 到 本地 origin/master 里
$git fetch origin master
# git fetch <refspec>
# Refspec 的格式是一个可选的 + 号,接着是 <src>:<dst> 的格式,这里 <src> 是远端上的引用格式, <dst> 是将要记录在本地的引用格式。可选的 + 号告诉 Git 在即使不能快速演进的情况下,也去强制更新它。
# +refs/heads/*:refs/remotes/origin/*
git fetch --tags --process ssh://git@git.remote.com/xxx.git +refs/<tag, like heads>/<tag>:refs/remotes/origin/<tag>
git pull
与fetch 不同的是, git pull 可以指定要更新的本地分支(可以理解为不同代码版本的指针)
git pull 相当于 git fetch + git merge
$ git pull <远程仓库> < 远程分支>:<本地分支>
$ git pull origin master:chlq_cases
# 取回远程origin仓库的master分支, 与本地chlq_cases分支合并
# 不加 本地分支, 则默认合并当前分支
$ git pull origin master # 等效于下面的两句
$ git fetch origin
$ git merge origin/master
git push
git push 命令用于将本地分支的更新,推送到远程仓库
$ git push <远程仓库> <本地分支>:<远程分支>
# 如果省略 远程分支名 默认推送到与本地分支有 追踪关系的远程分支
$ git push origin master
# 省略本地分支, 表示 删除指定的远程分支
$ git push origin :master
# 等同于
$ git push origin --delete master
git tag
git tag 可以将分支上某个时间点的代码打上标签,方便代码版本管理、代码回滚等
$##打标签
$git tag -a your-tag-name -m "msg"
$##同步到远端仓库
$git push origin your-tag-name
$##列出说有tag
$git tag -l
追踪
fork 及 上传到upstream
撤销操作
对commited的文件
$ git reset HEAD <file>...
对added的文件
$ git checkout -- <file>...
git stash
##简单实用
git stash
...
git stash pop
##更复杂点
git stash save "work in progress for foo feature"
##查看未提交的GIT栈
git stash list
##选择第几个栈
git stash apply stash@{1}
查看log
man git-log
# 查看提交记录
git log
# 查看文件变更
git log --stat
commit dff06bc5535f40c0cbe4df905f69eec4418a056b
Author:
Date: Wed Jun 28 22:15:01 2017 +0800
modify serve host ip and add some cases
.../TestNotifyPayInfo.java | 84 ++++++--------
.../TestGetSettleBillOrderVoList4PC.java | 53 +++++++++
.../TestGetSettleMockAccountFlows.java | 124 +++++++++++++++++++++
.../TestQueryAllAccountInfo.java | 65 +++++++++++
src/test/resources-beta/conf/server.properties | 2 +-
src/test/resources-test/conf/server.properties | 2 +-
6 files changed, 277 insertions(+), 53 deletions(-)
#查看指定commit, 可以看到文件变更,内容更改
git show $commitCode
#以作者或提交人查看
git log -p --author=chlq
git log -p --commitor=chlq
#以时间查看
git log -p --since="2017-06-27" --until="2017-06-28" --author=chlq
回退
#回退命令:
$ git reset --hard HEAD^ #回退到上个版本
$ git reset --hard HEAD~3 #回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id #退到/进到 指定commit的sha码
#强推到远程:
$ git push origin HEAD --force