JHHK

欢迎来到我的个人网站
行者常至 为者常成

Git官方文档

目录

一、起步

1.6 起步 - 初次运行 Git 前的配置

git 版本查看
git --version


配置全局配置文件
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com


配置当前仓库的配置文件 如果不配置默认使用全局的配置文件 ~/.gitconfig
git config "user.name" xxx
git confit "user.email" xxx@163.com


配置编辑工具 mac默认使用vim 一般不需要特意配置
git config --global core.editor emacs


查看配置表
git config --list
git config -l


通过输入 git config <key>来检查 Git 的某一项配置
git config user.name
git config --global user.name


将该仓库的config同步到全局的config
git config --gloabal

1.7 起步 - 获取帮助

获取帮助的三种方法
git help config
git config --help
man git-config


一级指令帮助 
git --help  
二级指令帮助 
git init --help

二、Git 基础

2.1 Git 基础 - 获取 Git 仓库

在现有目录中初始化仓库
git init
git add *.c
git add LICENSE
git commit -m 'initial project version'


克隆现有的仓库
git clone https://github.com/libgit2/libgit2
git clone https://github.com/libgit2/libgit2 mylibgit

2.2 Git 基础 - 记录每次更新到仓库

检查当前仓库状态
git status
git status -s
git status --short
git status xxx.m


状态说明:
Untracked files:未被仓库管理,比如新添加的文件 (未被仓库跟踪)
Changes not staged for commit 已经被仓库管理,未在暂存区(在工作区)
Changes to be committed 文件已在暂存区(在暂存区)


跟踪文件 加入暂存区 冲突解决完成 都用该指令
git add .
git add xxx.m


查看改动
git diff//要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff
git diff --cached //若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令
git diff --staged //相当于 git diff --cached
git diff origin master  //查看本地与远程的改动
git diff 880234e 878a0de //查看两次提交的改动
git difftool //可以使用该命令来用 Araxis ,emerge 或 vimdiff 等软件输出 diff 分析结果。
git difftool --tool-help //使用该命令来看你的系统支持哪些 Git Diff 插件。


提交更新
git commit
git commit -m "message"
git commit -a -m "message"


移除文件
git rm test.h   //解除仓库跟踪 并移除文件
git rm --cached test.h //从仓库移除对test.h的管理 但在本地保留test.h


对文件重命名
git mv test.h test

2.3 Git 基础 - 查看提交历史

查看提交
git log
git log master
git log xxx.m   //查看某个文件的提交记录
git log -n  //查看最近n次的修改
git log --stat  //如果你想看到每次提交的简略的统计信息,你可以使用 --stat
git log -p -2   //一个常用的选项是 -p,用来显示每次提交的内容差异你也可以加上 -2 来仅显示最近两次提交
git log --graph //以图表形式查看各分支的提交
git log --pretty=format:"%h %cn %s" --graph 
git log --oneline --graph --all //以图表形式查看各分支的提交
git log --pretty=oneline    //以行显示简单提交记录
git reflog  //显示提交记录(包括回退)

显示远程提交记录
git log remotes/origin/master
git reflog remotes/origin/master
git log --pretty=oneline remotes/origin/master

...

2.4 Git 基础 - 撤消操作

追加提交
git commit --amend
合并提交(前开后闭)
git rebase -i 880234e  980435a


取消暂存的文件
只在工作区做了更改(未add 未cmmit)
git checkout -- test.h
git checkout .


清空工作区()
git checkout .
git clean -d -f


工作区做了更改,执行了git add test.h
git reset head  //或者 git reset test.h
git checkout -- test.h


工作区做了更改,执行了git add test.h,git commit -m "modify test.h file";
git reset head^
git checkout -- test.h


撤销格式
git reset --hard HEAD^  //回退到上一个版本:
git reset --hard HEAD^^ //回退到上上一个版本:
git reset --hard HEAD~N(N是一个整数)//回退到上N个版本:
git reset --hard 版本号^(版本号用7位即可) //回退到任意一个版本:


撤销仓库并向远程提交回滚
git reset --hard 83a211eb75d27fbcfe895889a33bb09b6ff864d3^
git push origin --force

2.5 Git 基础 - 远程仓库的使用

查看远程仓库
git remote
git remote -v   //显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL


添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写
git remote add pb https://github.com/paulboone/ticgit


如果你想拉取 Paul 的仓库中有但你没有的信息,可以运行 git fetch pb
执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
必须注意 git fetch 命令会将数据拉取到你的本地仓库——它并不会自动合并或修改你当前的工作。 
当准备好时你必须手动将其合并入你的工作。
git fetch pb
git fetch origin master //抓取远程仓库origin的master分支



如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支
默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 
运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
git pull
git pull origin master



推送到远程仓库 git push [remote-name] [branch-name]
当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 
你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送
git push origin master  //将当前分支master 推送到远程仓库origin 的master分支
git push origin master:master   //相当于git push origin master
git push //如果设置了跟踪 会自动推送到当前分支跟踪的远程分支
git push origin test:master //将本地test分支的变更推送到origin的master分支


查看某个远程仓库
git remote show origin


远程仓库的移除与重命名
git remote rename pb paul   //重命名
git remote rm paul  //移除

2.5 补充 - 本地仓库初始化与同步

创建一个远程空仓库(没有.gitignore README.md文件 licence文件)
https://github.com/xxx/gitTest.git

创建本地仓库
cd ~/Desktop/gitTest
echo "# gitTest" >> README.md
git init
git add README.md
git commit -m "first commit"

同步本地与远程仓库
git remote add origin https://github.com/xxx/gitTest.git
git push -u origin master

2.6 Git 基础 - 打标签

列出标签
git tag
git tag -l 'v1.8.5*'


创建标签 Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)
git tag -a v1.4 -m "my version 1.4" //在 Git 中创建一个附注标签是很简单的。最简单的方式是当你在运行 tag 命令时指定 -a 选项
git tag v1.4-lw //轻量标签
git tag -a v1.2 9fceb02 //后期打标签


查看标签
git show v1.4


共享标签 当其他人从仓库中克隆或拉取,他们也能得到你的那些标签
git push origin v1.5    //将特定标签推送到远程
git push origin --tags  //这将会把所有不在远程仓库服务器上的标签全部传送到那里。


删除标签
git tag -d v1.4-lw  //删除掉一个标签
git push origin :refs/tags/v1.4-lw  //更新远程仓库


检出标签
git checkout 2.0.0
在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化,但你的新提交将不属于任何分支,并且将无法访问,除非确切的提交哈希。
因此,如果你需要进行更改——比如说你正在修复旧版本的错误——这通常需要创建一个新分支:
git checkout -b version2 v2.0.0

2.6 补充 - stash的使用

查看stash
git stash list

查看某次stash存储的内容
git stash show -p 0

默认名称储藏工作区:
git stash 
按照指定储藏名称储藏工作区:
git stash save "stash test"

默认使用指向栈顶记录
git stash apply 
通过指定使用储藏区记录的名称来恢复stash的内容
git stash apply stash@{0}

默认的也是从栈顶开始删除
git stash drop
删除储藏区某一记录:
git stash drop stash@{0}

此方式直接从储藏区堆栈中的栈顶弹出最近的一次stash操作的内容,并删除堆栈中的当前stash操作记录;
git stash pop

2.7 Git 基础 - Git 别名

git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'

三、Git 分支

3.1 Git 分支 - 分支简介

git log --oneline --decorate
git checkout testing
git log --oneline --decorate --graph --all

3.2 Git 分支 - 分支的新建与合并

创建分支
git branch iss53
检出分支
git checkout iss53
创建并检出新分支
git checkout -b iss53   //相当于 git branch iss53  git checkout iss53


删除分支
git branch -d hotfix


合并hotfix分支到当前分支
git merge hotfix
git mergetool   //遇到冲突时 启用合并工具 在这里 Git 使用 opendiff 做为默认的合并工具

3.3 Git 分支 - 分支管理

分支管理
git branch              //查看分支列表
git branch -v           //查看每一个分支的最后一次提交

查看哪些分支已经合并到当前分支 
在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;
你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
git branch --merged     

查看所有包含未合并工作的分支
这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败
如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。
git branch --no-merged 

3.4 Git 分支 - 分支开发工作流


3.5 Git 分支 - 远程分支

显式地获得远程引用的完整列表
git ls-remote 

获得远程分支的更多信息 git remote show (remote) 
git remote show origin


推送 git push (remote) (branch):
git push origin serverfix
git push origin serverfix:serverfix
git push origin serverfix:awesomebranch //将本地的 serverfix 分支推送到远程仓库上的 awesomebranch 分支


合并远程分支
git merge origin/serverfix 


跟踪分支
如果想要在自己的 serverfix 分支上工作,可以将其建立在远程跟踪分支之上
这会给你一个用于工作的本地分支,并且起点位于 origin/serverfix
git checkout -b serverfix origin/serverfix
git checkout --track origin/serverfix
git branch -u origin/serverfix  //设置当前分支跟踪origin/serverfix
git branch --set-upstream-to origin/test    //同上


查看所有分支的跟踪情况
需要重点注意的一点是这些数字的值来自于你从每个服务器上最后一次抓取的数据。 
这个命令并没有连接服务器,它只会告诉你关于本地缓存的服务器数据。 
如果想要统计最新的领先与落后数字,需要在运行此命令前抓取所有的远程仓库。 
可以像这样做:$ git fetch --all; git branch -vv
git branch -vv


拉取
从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并
git fetch

大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令
都会查找当前分支所跟踪的服务器分支,从服务器上抓取数据然后尝试合并分支。
git pull    //相当于 git fetch;git merge


删除远程分支
git push origin --delete serverfix
git push origin -d serverfix

3.6 Git 分支 - 变基

rebase 普通场景的应用
git checkout experiment //检出 experiment分支
git rebase master       //将experiment分支的内容在master分支重放
git checkout master     //切换到master分支
git merge experiment    //master分支进行一次快进合并
注:此时experiment分支与master分支指向同一个地方 注意区分与merge结果的不同


更有趣的变基例子
git rebase --onto master server client  //将client分支上不同与server的提交 重放到master分支
git checkout master
git merge client
git rebase master server    //将server变基到master分支 这样做能省去你先切换到server分支再对其执行变基命令的多个步骤
git checkout master
git merge server
注:变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交


变基的风险
不要对在你的仓库外有副本的分支执行变基。
只要你把变基命令当作是在推送前清理提交使之整洁的工具,并且只在从未推送至共用仓库的提交上执行变基命令,就不会有事。
假如在那些已经被推送至共用仓库的提交上执行变基命令,并因此丢弃了一些别人的开发所基于的提交,那你就有大麻烦了,你的同事也会因此鄙视你。
如果你或你的同事在某些情形下决意要这么做,请一定要通知每个人执行 git pull --rebase 命令,这样尽管不能避免伤痛,但能有所缓解


解决变基风险的方法
git fetch
git rebase teamone/master
git pull --rebase   //相当于git fetch;git rebase teamone/master;
注:如果你习惯使用 git pull ,同时又希望默认使用选项 --rebase,
你可以执行这条语句 git config --global pull.rebase true 来更改 pull.rebase 的默认配置。


变基 vs 合并
总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利

3.7 Git 分支 - 总结

我们已经讲完了 Git 分支与合并的基础知识。 
你现在应该能自如地创建并切换至新分支、在不同分支之间切换以及合并本地分支。 
你现在应该也能通过推送你的分支至共享服务以分享它们、使用共享分支与他人协作
以及在共享之前使用变基操作合并你的分支。 

四、服务器上的 Git

五、分布式 Git

六、GitHub

七、Git 工具

八、待整理

捡草莓

//在某次记录提交分支
git log  查到那个记录  commitId
//这是测试内容
//切换到目的分支
git cherry-pick  提交ID

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.