本地操作
Git Book - https://git-scm.com/book/zh/
Git Book - https://git-scm.com/book/zh/v2
参考资料:http://git.oschina.net/progit/
参考资料:http://rogerdudler.github.io/git-guide/index.zh.html
参考资料:http://backlogtool.com/git-guide/cn/
参考资料:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
https://ourai.ws/posts/working-with-git-in-team/
https://wenku.baidu.com/view/e1430d1b7f1922791788e81e
以及极客学院的资料
Linux下安装:
--git安装依赖命令
sudo yum -y install zlib-devel openssl-devel cpio expat-devel gettext-devel curl-devel perl-ExtUtils-CBuilder perl-ExtUtils- MakeMaker
wget https://github.com/git/git/archive/v2.8.0.tar.gz
tar -zxvf git-v2.8.0.tar.gz
cd git-v2.8.0
make prefix=/usr/local/git all
make prefix=/usr/local/git install
whereis git
vim /etc/profile
export PATH=$PATH:$JAVA_HOME/bin:/usr/local/git/bin:$CATALINA_HOME/bin:$MAVEN_HOME/bin:$NODE_HOME/bin:/usr/local/bin:$RUBY_HOME/bin
source /etc/profile
git --version
git config --global user.name porters
git config --global user.email 1906846616@qq.com
git config --global core.autocrlf false //忽略win和linux的换行符转换
git config --global core.quotepath off //避免中文乱码
git config --global gui.encoding utf-8
ssh-keygen -t rsa -C "1906846616@qq.com"
--一路回车
eval `ssh-agent`
ssh-add ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub
...
mac下安装:
cd ~
which -a git // 查看mac下安装了哪些版本的git
git --version // 查看git的版本
git-scm.som // 从官网下载安装包,并安装
vim .bash_profile // linux下不同好像是.bash_rc
export PATH=/usr/local/git/bin:$PATH
source .bash_profile
自动完成
github.com/git/git //从github下载源码zip,解压
cp contrib/completion/git-completion.bash ~/
cp contrib/completion/git-prompt.sh ~/
git --version //再次查看
git config --help //q退
git help config //q退
man git-config //mac下
q退出
win下安装:
git config //tab键会自动补全, 再按一下会有提示可能的282个命令
git config -- //tab键会提示参数
git config --global --unset-all user.name //移除所有user.name行
--git增删改查
git config --global user.name "zhipengliu"
git config --global user.email "git@zhipengliu.com"
git config --global user.name pengliu //修改
git config --global --add user.name pengliu //追加
git config --global user.name
git config --get user.name
git config user.name
git config --list --global //查看所有
git config --global --unset user.name pengliu
git config --global --unset user.name //移除所有user.naem行
--git的子命令以及参数 其别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.lol "log --oneline"
git config --global alias.lol "log --oneline --decorate --graph --all --date-order
"
--git中的四种对象
1 blob
2 tree
3 commit
4 tag
1. git init
2. git clone
git init git_non_bare_repo //初始化一个git仓库
git init --bare git_bare_repo //创建裸仓库
git clone git_brare_repo/ git_clone_repo //从裸仓库克隆一个git仓库(也可以克隆一个远程地址)
git仓库有三个工作区域:
working directory: 工作区 (也就是我们日常编写代码存放的地方)维护着一个树形结构
staging area: 暂存区(相当于工作区与历史提交中间的一个缓存, 他代表的是你需要提交的一个工作的状态,维护的是一个虚拟的树形结构)
history repository: 历史仓库(他是一个commit指向的一个树形结构)
Changes not staged for commit 未提交的更改
changes to be committed 已暂存
Untracked files 跟踪文件
Unstaged changes after reset 复位后未改变
1. git add : 添加到暂存区git add -A git add .
2. git commit : 提交到历史中
3. git status : 查看工作区与暂存区之间的区别, 确保我们提交时我们所需要的git status -s
4. git rm : git rm --cached a可以从暂存区删除我们不需要的a文件
5. git mv : 底层git帮你做了在工作区对文件重命名, 删除暂存区的文件, 再把重命名的文件添加到暂存区
.gitignore : 确保工作区不希望添加到暂存区,或历史中的文件不被添加进去
1. git branch // 创建分支(查看分支git branch)(删除非当前分支git branch -d 分支名)
2. git tag // 给一个固定的commit做标记,
git tag -a "INITIAL_COMMIT" f77ce01(-a给commit是f77ce01的打一个含附注的(annotated)标签)
git push origin v1.5
git push origin --tags
3. git checkout // 怎么在分支之间进行切换,
还可以git checkout a //此时还原a文件到工作区
还可以git checkout -b fix_v0 //相当于git checkout和git branch的组合
4. git stash // 怎么样在切换分支之前保存本地的修改
git stash save -a "stash1" //在返回到的最近指向的commit点,并把未提交的修改stash起来,
-a暂存区的内容也stash起来,同时把这些操作记录保存一个临时的地方
git stash list 查看之前保存的stash
git stash pop --index stash@{0}
git stash apply --index stash@{0}
git stash drop stash@{0}
git stash clear
5. git merge // 怎么合并分支
git merge --abort //内容有冲突,放弃这次merge的合并
1. git show // 可以跟一个代表commit的对象
2. git log
3. git diff
git show 6fa315a
git show master
git show HEAD
git show HEAD~ git show HEAD~~ git show HEAD~2
git show master~ git show master~~ git show master~2
git show HEAD^ git show HEAD^^ git show HEAD^2
git show master^ git show master^^ git show master^2
git show master^2 //除了使用hash格式,只有master^2格式才能查看第二幅提交的最后commit(实验获得), 其他格式只是在当前的线性分支依次递减向前推移查看
git show --oneline master^2 //hash 提交者 提交时间缩成了一行
git show --stat master^2 //提交的统计信息
git show --oneline --stat master^2 //提交的commit信息, 和统计信息
git show --format=%T master^2 //此commit指向的tree对象
git log
git log -p
git log --stat
git log --oneline
git log --oneline --decorate --graph --all
git diff HEAD~2 -- master.txt
git diff --cached HEAD~2
git diff HEAD HEAD~2
git diff HEAD HEAD~2 -- master.txt
git diff --color-words
git diff --word-diff
1. git checkout //还原工作区
2. git reset //还原暂存区
3. git clean //git还没有跟踪的文件, git clean清除
4. git revert //产生新的提交覆盖原来的之间的提交,达到撤销以前的一个commit提交的目的
命令git checkout -- readme.txt意思就是: 用此刻head上的已提交的内容回到这个文件最近一次git commit或git add时的状态。
命令git reset HEAD file意思就是: 用此刻head上的已提交的内容覆盖暂存区**(默认是--mixed: git reset --mixed HEAD file)
//移除没有被git管理的文件(n查看)(真正删除用f替换n)
git clean -n //移除没有在.ignore中列举的
git clean -n -X //只移除.ignore中列举的
git clean -n -x //移除所有(包含.ignore中列举的)
git revert 一个代表commit点的对象 //产生新的提交覆盖原来的之间的提交,达到撤销以前的一个commit提交的目的
git revert --abort //撤销操作
1. git commit --amend //产生一个新的提交, 替换当前指向的这个提交
2. git rebase //历史修改能力, 帮助我们维护一个线性的历史
3. git reset //刚刚创建了给合并的提交, 想撤销的这个合并的提交,让我们的历史看上去没有合并这个提交
4. git reflog //维护了一个head引用的一个历史信息, 通常配合git reset来使用
//test_rebase分支上做错了, 需要回退
git reflog //根据test_rebase上最后一个commit进行还原
git reset --hard HEAD@{7} //--hard: 工作区和暂存区被历史还原,把head和分支名的引用指向我们这个commit
//--mixed(默认) : 还原暂存区,把head和分支名的引用指向我们这个commit
//--soft: 不还原, 把head和分支名的引用指向我们这个commit
远程协作
github.com
bash下:
ssh-keygen -t rsa -C "xxxxxx@163.com"
*****
*****
eval `ssh-agent -s`
eval "$(ssh-agent -s)" //win: `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
*****
****
cat ~/.ssh/id_rsa.pub
vim ~/.ssh/id_rsa.pub
例如:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUgpHqZm/MtbVFP4aOlEYVcfwG+ey2wxfv/lMMJN1V
iGtBkUnz/9l+9XrVqiIbVg40Z3D2xvK3qIOoowlA2kyKUa1TBF+Tc3e66sECJxnCZarBz9G8FHLIhs07
rJjhB5qo7mToLQl/p2oRyY3BeAyoflLh/SJLZEXxrBivn8YA5CGuZm9TCujv1IyasVn3WqbvoRENLAiq
rKz5uyFzP43IsPajCBvxF80u+I89ynrKZYx2hqguC7QQ7aKXQUeriqfD+YvhuRMTBCt9xIuARJ9Caw8D
i3jBiIIa5nZrX+vD1z9zsErqTETqpiJd2UtvIDc1fI9H2lEtAHqRwwHyqZrz xxxx@163.com
在github.com中setting中添加sshkey
验证bash下:
ssh -T git@github.com
输入你刚才设置的密码, 出现你的账户成功授权了
Hi portersLiu! You've successfully authenticated...
git clone
git fetch //拉取远程仓库数据
git pull //获取最新数据,//git pull=>git fetch + git merge
git push //如果push成功, 远程跟踪分支head会自动指向到跟踪分支最新的commit上
更新本地分支
git fecth origin
git fecth origin feacher
git pull origin feacher
跟踪远程分支
git checkout -b [分支名] [远程分支]/[分支名] //如果你有 1.6.2 以上版本的 Git,还可以用 --track
选项简化:
git chckout --track origin/serverfix
git checkout -b sf origin/serverfix //在本地起个别名
推送本地分支
git push [远程名] [本地分支]:[远程分支]
git push origin refs/heads/serverfix:refs/heads/serverfix
git push origin serverfix:serverfix
git push origin serverfix
把本地分支推送到某个命名不同的远程分支:若想把远程分支叫作 awesomebranch
,可以用
git push orgin serverfix:awesonebranch
删除远程分支
git branch -d feacher //删除本地分支
删除远程分支的方式
git push --delete origin feacher
另一种删除远程分支的方式
git push origin :feacher //git push [远程名] [本地分支]:[远程分支]
语法,如果省略 [本地分支]
,那就等于是在说“在这里提取空白然后把它变成[远程分支]
”。
GitHub Pull Request流程
1. GitHub上fork项目
2. git remote
3. pull request
搜索别人的用户
找到他的仓库
点击Fork, 到了自己的仓库
克隆下来
一般新建功能分支承载我们的修改
git checkout -b feature
vim xxx
git add xxx
git commit -m "update xxx on feature"
git push origin feature
在master上创建pull request
就是别人master分支与自己的feature分支的一个差异
点击create pull request
...
别人用户就可以看到
再次给别人这个项目pull request流程:
git remote add upstream https://github.com/别人用户/xxxx.git
git remote -v
git checkout master
git fetch upstream //更新下来的是别人用户master上最新的代码
git merge upstream/master //合并到我们master分支, 我们test和别人的test就一样了
git remote rename daydayup //改名
git remote rm daydayup //删除
深入理解远程协作
跟踪分支(tracking branch)与远程跟踪分支(remote tracking branch)的概念
远程操作中的remote配置
远程操作中的branch配置
建议使用git fetch,git merge或git rebase代替git pull
git diff master origin/master --查看结果决定是否使用merge或rebase操作
remote配置
自己的团队:
git remote set-branches --add origin qa/*
cat ./git/config
[remote "orgin"]
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
qa团队:配置
git push origin master:qa/master
或者
vim ./git/config
[remote "orgin"]
push = refs/heads/*:refs/heads/qa/*
git push origin
git remote add fork https://github.com/别人用户/mytest.git
cat ./git/config
[remote "fork"]
url = https://git.oschina.net/porters/tutorial.git
fetch = +refs/heads/*:refs/remotes/fork/*
branch配置的作用
如何配置branch
第一种方式:
git branch --set-upstream-to=origin/v0 v0
cat ./git/config
[branch "v0"]
remote = origin
merge = refs/heads/v0
第二种方式:
git branch [--set-upstream | --track] v1 origin/v0
cat ./git/config
[branch "v1"]
remote = origin
merge = refs/heads/v0
第三种方式:
git push -u origin v2
cat ./git/config
[branch "v2"]
remote = origin
merge = refs/heads/v2
第四种方式:
git checkout v3
cat ./git/config
[branch "v3"]
remote = origin
merge = refs/heads/v3
第五种方式:
git branch v4
git config branch.v4.remote origin
git config branch.v4.merge refs/heads/master
cat ./git/config
[branch "v4"]
remote = origin
merge = refs/heads/v4