Git学习笔记
在Windows上安装Git
直接下载安装,安装完成后,还需要最后一步设置,在 Git bash 中输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
创建版本库(Repository)
在计算机中一个合适的文件夹下右键 Git bash here ,输入指令 git init 命令把这个目录变成Git可以管理的仓库。
把一个文件房贷Git仓库只需要两步:
- 用命令git add file_name 告诉Git,把文件添加到仓库;
- 用命令git commit -m "这是一个提交说明" 告诉Git,把文件提交到仓库。
add 命令可以使用多次,而 commit 命令一次可以提交多个到Git仓库。
时光机穿梭
- 要随时掌握工作区的状态,使用git status 命令;
- 如果git status 告诉你有文件被修改过,用可以git diff查看修改的内容。
版本回退
git log 命令显示从最近到最远的提交日志,如果嫌输出信息太多,看的眼花缭乱的,可以加上 --pretty=oneline 参数: git log --pretty=oneline
可以看到这个图里面,每一次的commit的信息都有一个使用SHA1计算出来的 commit id 。
回退版本时,使用:
# 回退到上一个版本 git reset --hard HEAD^ # 回退到上上个版本 git reset --hard HEAD^^ # 回退到往上100个版本 git reset --hard HEAD~100
回退版本后悔的时候,使用 git reflog 查看记录的每一次命令:
仍然是使用 git reflog 命令可以前往任意一个版本:
git reset --hard 760f5 HEAD is now at 760f506 append GPL
工作区和暂存区
撤销修改
1、当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file
2、当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD ,就回到了场景1,第二步按场景1操作。
3、已经提交了不合适的修改到版本库时候,想要撤销本次修改,使用回退功能,不过前提是没有推送到远程库
删除文件
命令 git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
添加远程库
使用指令添加一个.ssh密匙,在目标目录生产一个.ssh文件,里面有个公钥文件,一个私钥文件。
要关联一个远程库,使用命令: git remote add origin git@server-name:path/repo-name.git ;
关联后,使用命令 git push -u origin master 第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
从远程库克隆
要克隆一个仓库,首必须要知道仓库的地址,然后使用 git clone git@github.com:michaelliao/gitskills.git 命令克隆。
Git支持各种协议,包括 https ,但是通过 ssh 支持的原生 Git 协议更快。
创建与合并分支
Git鼓励大量使用分支:
查看分支: git branch
创建分支: git branch <name>
切换分支: git checkout <name>
创建+切换分支: git checkout -b <name>
合并某分支到当前分支: git merge <name>
删除分支: git branch -d <name>
冲突解决
在两个分支对一个文件都进行了修改的时候,并且两个分支修改的内容各不相同,在合并分支的时候就会发生无法合并的情况,这个时候就需要首先解决冲突,解决冲突之后,在提交,合并完成。
解决冲突就是吧Git合并失败的文件手动编辑为我们希望的内容,在提交。
用 git log --graph 命令可以看到分支合并图。
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但是这种模式下,删除分支后,会丢失分支信息。
如果要强制禁用Fast Forward模式,Git就会在merge是生成一个新的commit,这样,从分支历史上就可以看出分支信息。
使用 git merge 命令的时候使用 --no-ff 参数可以使得合并的时候强制禁用 Fast forward 模式,顺便可以使用 -m 命令来写入日志。
# 创建并切换dev分支 $ git checkout -b dev Switched to a new branch 'dev' # 修改readme.txt文件,并提交一个新的commit $ git add readme.txt $ git commit -m "add merge" [dev f52c633] add merge 1 file changed, 1 insertion(+) # 现在我们切换回master $ git merge --no-ff -m "merge with no-ff" dev Merge made by the 'recursive' strategy. readme.txt | 1 + 1 file changed, 1 insertion(+) # 查看日志 $ git log --graph --pretty=oneline --abbrev-commit * e1e9c68 (HEAD -> master) merge with no-ff |\ | * f52c633 (dev) add merge |/ * cf810e4 conflict fixed ...
bug分支
假设如下场景:你正在Git上完成Boss交给你的任务,预计还要好几年才能完成,但是万恶的Boss又给你指派了一个修复bug的任务,必须要在两小时内完成,这个时候要怎么办?Git提供了 stash 功能,可以把当前工作现成储藏起来,等以后恢复现场后继续工作;
在当前使用的分支上使用 git stash 命令来保存现场,切换到指定的分支进行bug修复,然后在切换回来,恢复现场的方法有两种:
- git stash apple 恢复,但是恢复之后,stash内容并不删除,需要使用 git stash drop 来删除
- git stash pop ,恢复的同时把stash内容也删除
使用 git stash list 查看stash内容
多次使用stash,恢复的时候,先用 git stash list 查看,然后恢复指定stash:
git stash apply stash@{0}
Feature分支
开发一个新功能(feature),最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过 git branch -D <name> 来强制删除它。
多人协作:
- 查看远程库信息,使用git remote -v ;
- 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用git push origin branch-name ,如果推送失败,先用git pull 抓取远程的新提交;
- 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name ,本地和远程分支的名称最好一致;
- 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name ;
- 从远程抓取分支,使用git pull ,如果有冲突,要先处理冲突。
Rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是是的我们在查看历史提交的变化时更容易,因为分叉的提交需要第三方对比。
创建标签
- 命令git tag <tagname>用于新建标签,默认为HEAD,也可以指定一个commit id;
- 命令git tag -a <tagname> -m "message"可以指定标签信息;
- 命令git tag可以查看所有标签。
操作标签
- 命令git push origin <tagname>可以推送一个本地标签;
- 命令git push origin --tags可以推送全部未推送过的本地标签;
- 命令git tag -d <tagname>可以删除一个本地标签;
- 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
忽略特殊文件
- 忽略某些文件时候,需要编写.gitignore 文件
- 使用-f 强制添加到Gitgit add -f App.class
- .gitignore 文件本身要放在版本库,并且可以对.gitignore 做版本管理。
配置别名
# 将status定义一个别名st git config --global alias.st status
# 极限配置lg git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
要删除别名,在 .git/config 文件中,别名就在 [alias] 后面,要删除别名,直接把对应的行删掉即可。
配置Git的时候,加上 --global 是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件 .gitconfig 中。