Git note


feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)注意不是 css 修改
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动
scope: commit 影响的范围, 比如: route, component, utils, build...
footer: 一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接.

init_add_status_commit_push

基础概念

已提交(committed):已提交表示该文件已经被安全地保存在本地数据库中了;

已修改(modified):已修改表示修改了某个文件,但还没有提交保存;

已暂存(staged):已暂存表示把已修改的文件放在下次提交时要保存的清单中。

初次运行基本配置

用户信息

$ git config --global user.name "Teaism"
$ git config --global user.email chenliangf1223@sina.com

配置文本编辑器

$ git config --global core.editor emacs

查看配置信息

$ git config --list

查阅某个环境变量的设定

$ git config user.name

删除某个配置项

$ git config (--local、--global、--system) --unset user.name

Git使用命令

获取帮助

$ git help config

初始化Git仓库

$ git init

从现有仓库克隆

$ git clone git://github.com/schacon/grit.git NewFileName

添加文件到仓库

$ git add Files

创建.ignore文件

$ touch .gitignore

删除文件(禁用:会从工作目录和暂缓中同时删除。)

$ git rm Files

$ git add -A (推荐)
它会把我们未通过 git rm 删除的文件全部stage

重命名文件

$ git mv file_from file_to

检查当前文件状态

$ git status

提交已暂存区(stage)的内容

$ git commit -m '提交说明'

查看日志

$ git log (--pretty=oneline)

** 查看文件差别

$ git diff #是工作区(work dict)和暂存区(stage)的比较
$ git diff --cached #是暂存区(stage)和版本库的比较

$ git diff HEAD -- Files #工作区和版本库的区别

** 撤销修改
[https://segmentfault.com/a/1190000007070302]
tips:命令 git checkout –readme.txt 意思就是,把readme.txt文件在工作区做的修改全部撤销,这里有2种情况,如下:

  1. readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。
  2. 另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。

工作区的代码想撤销 ( Files 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;)

$ git checkout -- Files (git checkout -- . 撤销所有文件,注意 ' . ')

add到暂存区的代码想撤销 (Files 已添加到暂存区后,又修改,现在,撤销修改就reset回到添加到暂存区后的状态。再checkout就是恢复到 版本库一样的)

$ git reset HEAD Filesname (git reset HEAD . 将所有文件)

$ git checkout -- Files

删除文件恢复
删除文件 $ git rm [Filenames] or rm [Filenames]
只要没有commit之前,如果我想在版本库中恢复此文件,可以使用如下命令:
$ git checkout — b.txt

版本回退(未提交到远程可回退,否则可本地回退再push到远程覆盖)

notes: reset指针直接指向上次提交(慎用),revert 是重新提交(推荐)。
$ git reflog OR $ git log --pretty=oneline (查看提交历史)。

$ git reset --hard [hash] (推荐这个,hash) OR $ git reset --hard HEAD@{$} ($向前回退几个版本)

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

从暂缓区删除文件(但工作区代码并未删除)

$ git rm --cached

GIT重置命令

reset命令可以改变.git/refs/heads/master下分支的引用,而不是永远指向最新的提交ID。

reflog(.git/logs/refs/heads/master)命令恢复

重置引用后提交历史信息会丢失,这时可以使用reflog命令查看操作日志,以便进行恢复操作

git reflog show master |head -5 显示master分之最近五次操作日志

git reflog -1 显示HEAD分支最近一次操作日志

reset命令的两种用法

用法一:git reset[-q][<commit>][--]<paths>

用法二:git reset[--soft|--mixed|--hard|--merge|--keep][-q][<commit>]

第一种用法不会重置引用和工作区,而是用commit下的文件替换暂存区文件,相当于撤销git add 的操作,其中commit可以省略,默认为HEAD

第二种则会重置引用,但会根据不同的参数从而 影响 工作区或者暂存区,其中commit也可以省略,默认为HEAD

使用参数--hard 工作区,引用、暂存区全部替换为commit

使用参数--soft 只更改引用,工作区和暂存区不影响
使用参数--mixed(不写默认) 只更改引用和暂存区,不影响工作区

git 分支

创建并切换到新的分支

$ git checkout -b
相当于:
$ git branch (新建分支)
$ git checkout (切换分支)

查看分支列表

$ git Branch

合并分支

合并Master 和 Branch1 分支:

$ git checkout Master
$ git merge Branch1

合并分支时同一文件同一部分冲突

此时需要到文件中手动保留需要的部分,然后add--commit。

删除分支( D 表示强制删除)

$ git branch -d ...

$ git branch -D ...

查看分支的合并情况

$ git log (--graph --pretty=oneline --abbrev-commit)

禁用快捷合并分支

$ git merge --no-ff -m "comments"

查看所有分支(分支颜色区分:白色-本地,绿色-当前,红色-远程)
$ git branch -a
切换远程分支
$ git checkout remotes/origin/master
删除远程分支
$ git branch -r -d <origin/branch>
$git push origin -d
拉取远程分支并创建为本地分支
$ git fetch origin dev:dev

修复Bug分支

Explain:

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

steps: (以master,dev,bug01分支为例):

储存dev当前工作区: $ git stash
切换到master分支上:
新建并切换分支bug01: $ git checkout -b
在新的bug01分支上修复,记得提交;
把bug01分支合并到master分支上,推荐'禁用快捷合并'方式:$ git merge --no-ff -m "comments" 到此bug修复成功。下面是回到先前的工作区:
切换到dev分支上
查看先前“储存‘的工作区: $ git stash list
恢复到指定处: $ git stash apply stash@{$}
成功!

$ git stash //把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash list //列出stash中的所有暂存的内容

方式一:git stash apply //仅恢复,;
$ git stash apply stash@{$} //还可以指定恢复哪一个,stash内容并不删除
$ git stash drop //来删除,stash(但是不确定删除哪个??)

方式二:git stash pop //恢复的同时把stash内容也删了(推荐)

参考: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137602359178794d966923e5c4134bc8bf98dfb03aea3000

bug排查

$ git bisect

打标签

查看已有标签列表

$ git tag

新增标签

$ git tag -a v1.2.0 -m 'my version 1.2.0'

后期加注标签

$ git tag -a v1.2.0 9fceb02 (9fceb02为提交时校验和前几位)

推动单个标签到远程服务器

$ git push origin v1.2.0

推动所有标签到远程服务器

$ git push origin --tags

退出vim编辑器:双击 D ,按了ESC后输入命令 :wq!

修改后 保存: ESC :wq 回车键
修改后 不保存:ESC :q 回车键

单单 git diff 不过是显示还没有暂存起来的改动,若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff --staged;

Git远程关联管理

**远程操作的第一步,最好从远程主机克隆一个版本库: git clone. 不然容易出现 not shell access

clone-pull-fetch-push

测试远程仓库链接是否成功

$ ssh -T git@github.com

测试443端口是否可用

$ ssh -T -p 443 git@ssh.github.com

添加远程仓库

$ git remote add origin git@github.com:Teaism/gitremote.git

展示远程仓库信息

$ git remote show mcvideo(别名)

查看当前远程仓库

$ git remote -v

推送到远程仓库

$ git pull origin master/dev (第一次推送之前需拉取远程的)

$ git push -u origin master

$ git push origin master (以后的推送)

**代码合并【注:pull=fetch+merge(拉取并合并=拉取+合并)](最好不要直接用pull,而是分开用) 。

$ git pull (mcvideo master) 无括号里表示拉取所有并合并

$ git fetch (mcvideo master) 无括号里表示拉取所有

$ git merge dev (合并dev到当前分支)

直接从远程origin的dev分支创建到本地dev来:

$ git checkout –b dev origin/dev

$ git pull origin master/dev/test 从远程仓库拉取指定分支
tips: git pull如果失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream dev origin/dev (// 本地远程分支关联: git branch --set-upstream-to=origin/<远程分支名> <本地分支名>如设置当前分支,第二个参数可省略,;)
origin: 如未指定,表示远程仓库的别名
合并pull两个不同的项目:
报错:fatal: refusing to merge unrelated histories
解决方法:git pull origin master --allow-unrelated-histories

冲突:
1、放弃工作区修改,
本地仓库代码完全覆盖本地工作区间,具体指令如下:
$ git checkout head .
(注意: 别遗漏 "head" 后的 " ." )
然后更新远程仓库的代码就不会出现冲突了:
$ git pull
2、解决冲突后提交本地修改
$ git stash
$ git stash save "这些是注释啦"
$ git pull
$ git stash pop
手工解决冲突,
然后add-commit-push

删除远程分支
$ git push origin --delete Branchname

远程仓库的重命名和删除

$ git remote rename pb paul

$ git remote rm paul

从commit里取消去某个文件夹的跟踪

git rm -r --cached path_to_your_folder/

合并几个commit

[http://zerodie.github.io/blog/2012/01/19/git-rebase-i/]

git merge 和 git rebase 的区别: [http://blog.csdn.net/wh_19910525/article/details/7554489]

$ git rebase -i commit-hash(不改变的那个)
进入vim
pick 的意思是要会执行这个 commit (第二新提交)
squash 的意思是这个 commit 会被合并到前一个commit (最新提交,合并到第二新提交)

Esc:wq ,保存并退出。成功。
git log --pretty=oneline 查看结果。
如操作错误随时终止 $ git rebase --abort,会回到未开始合并之前的状态。

git pull # 抓取远程仓库所有分支更新并合并到本地

git pull --no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并

git fetch origin # 抓取远程仓库更新

git merge origin/master # 将远程主分支合并到本地当前分支

git co --track origin/branch # 跟踪某个远程分支创建相应的本地分支

git co -b <local_branch> origin/<remote_branch> # 基于远程分支创建本地分支,功能同上

git push # push所有分支

git push origin master # 将本地主分支推到远程主分支

git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)

git push origin <local_branch> # 创建远程分支, origin是远程仓库名

git push origin <local_branch>:<remote_branch> # 创建远程分支

git push origin :<remote_branch> #先删除本地分支(git br -d ),然后再push删除远程分支

Git远程仓库管理

GitHub

git remote -v # 查看远程服务器地址和仓库名称

git remote show origin # 查看远程服务器仓库状态

git remote add origin git@ github:robbin/robbin_site.git # 添加远程仓库地址

git remote set-url origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址) git remote rm # 删除远程仓库

创建远程仓库

git clone --bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库

scp -r my_project.git git@ git.csdn.net:~ # 将纯仓库上传到服务器上

mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库

git remote add origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址

git push -u origin master # 客户端首次提交

git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track

git remote set-head origin master # 设置远程仓库的HEAD指向master分支

也可以命令设置跟踪远程库和本地库

git branch --set-upstream master origin/master

git branch --set-upstream develop origin/develop

参考:[http://www.cnblogs.com/cspku/articles/Git_cmds.html]

[http://shaofan.org/git/]

posted @ 2017-11-17 15:57  Teaism  阅读(430)  评论(0编辑  收藏  举报