Git安装
Linux安装
Debian或Ubuntu,Git安装命令:
sudo apt-get install git
其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入以下命令:
./config
make
sudo make install
Mac有两种安装Git的方法
- 通过homebrew安装,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
- 从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。(Xcode是Apple官方IDE,功能非常强大,是开发Mac和iOS App的必选装备,而且是免费的!)
Windows安装Git
-
从Git官网直接下载安装程序(https://git-scm.com/downloads),(网速慢的同学请移步国内镜像),然后按默认选项安装即可。
-
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
-
安装完成后,还需要最后一步设置机器的标识,在命令行输入:
-
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
本地仓库
初始化本地仓库
- 创建文件夹,并进入文件夹,执行git init命令把这个目录变成Git可以管理的仓库:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
-
查看隐藏的.git目录
ls -ah
.git目录外是工作区,.git目录里分为暂存区和分支;图片、视频、Word文档这些二进制文件可以由版本控制系统管理,但没办法跟踪文件的变化,只能知道图片从100KB改成了120KB,但改了什么版本控制系统不知道。
-
将文件添加到仓库(暂存区)
git add readme.txt
-
将文件提交到仓库(将暂存区的内容提交到分支)
git commit -m "append GPL"
-
查看仓库当前的状态:
git status
-
查看文件差异
-
git diff readme.txt
-
显示提交日志
git log
-
简化显示提交日志
git log --pretty=oneline
版本回退
-
回退到版本库的最新版本
git reset --hard HEAD(版本号)
-
回退到版本库的最新版本的上一版本或上100版本
git reset --hard HEAD^/HEAD~100
执行回退后在git log提交记录里再也看不到此版本后的记录了,如果git log的命令窗口没关掉可以找到里面的提交记录编号再执行reset --head命令来回到之后的版本(版本号输入前几位即可):
git reset --hard 3628164
-
查看执行命令的历史
git reflog
管理修改
Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
-
查看工作区和版本库里面最新版本的区别
git diff HEAD -- readme.txt
撤销修改
-
丢弃工作区的修改
git checkout -- readme.txt
-
将暂存区的修改撤销掉(unstage)
git reset HEAD readme.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
删除文件
直接在文件管理器中把没用的文件删了,或者用rm命令删了:rm test.txt,Git知道你删除了文件,工作区和版本库不一致,使用git status来查看当前状态
- 确认删除或恢复文件:
-
确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
-
恢复文件因为版本库中还存在,所以可以把误删的文件恢复到最新版本:git checkout – test.txt
远程仓库
先有本地库,再有远程库
-
本地仓库关联到远程仓库
git remote add origin git@github.com:michaelliao/learngit.git
-
本地仓库的内容推送到远程master分支
-
git push -u origin master
第一次推送master分支时,加上了**-u参数**,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
-
推送最新修改(origin远程 master分支名称)
-
git push origin master / git push
先有远程库,再有本地库
-
克隆远程库到本地
-
git clone git@github.com:michaelliao/gitskills.git
分支管理
- 主分支:即master(指针)分支
- HEAD指向的是当前分支
- 每次向master提交,master分支都会向前移动一步;
- Git新建分支(指针)dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
- Git创建一个分支很快,除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化!
- Git合并分支也很快,只是改变指针,工作区内容也不变。
-
创建分支
-
git branch dev
-
创建并切换到dev分支
-
git checkout -b dev
-
切换分支
-
git checkout dev
-
查看当前所在分支
-
git branch
-
合并指定分支到当前分支
-
git merge dev
-
删除dev分支
-
git branch -d dev
-
强行删除分支
-
git branch -D <name>
-
从远程克隆git仓库
-
git clone git@github.com:michaelliao/learngit.git
克隆后只能看到本地的master分支
-
创建远程origin的dev分支到本地dev分支
-
git checkout -b dev origin/dev
-
远程分支关联
使用git在本地新建一个分支后,需要做远程分支关联。如果没有关联,git会在执行git pull, git push操作时提示你需要添加关联。
git branch --set-upstream branch-name origin/branch-name
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
-
查看分支合并图
-
git log --graph
-
查看分支历史
-
git log --graph --pretty=oneline --abbrev-commit
分支管理策略
合并分支时通常会用Fast forward(git merge dev)模式,但这种模式下,删除分支后会丢掉分支信息。
合并时禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m “merge with no-ff” dev --no-ff参数表示禁用Fast forward,因为合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
Bug分支
-
储藏工作区的现场
-
git stash
-
恢复工作现场的同时把stash内容也删掉
-
git stash pop
-
查看工作现场储藏未恢复的记录
-
git stash list
-
恢复一个储藏工作现场
-
git stash apply stash@{0}
-
删除list里的储藏内容记录
-
git stash drop
这时可以在当前分支或切换到任何其它分支上,创建新的分支进行bug修改,修改完成后提交代码;再回到原分支执行git stash pop恢复工作区的现场。
多人协作
-
查看远程库的信息
-
git remote
-
查看远程库详细信息
-
git remote -v
-
查看远程分支
-
git branch -a
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
多人协作的工作模式通常是这样:
-
首先,可以试图用git push origin branch-name推送自己的修改;
-
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
-
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
git config --global --list
git config --local --list
git config --system --list
修改默认推送方式
git config --global push.default ‘upstream’
upstream推送方式下设置当前分支和远程分支关联,可以直接使用git push方法
git push -u origin HEAD:feature/develop