Git 技巧小结
本篇博客内的内容,主要摘抄自 廖雪峰的 Git教程,这篇教程写的通俗易懂,步步深入,是我见过最棒的Git教程了。下面的全部内容,摘抄自此教程,有需要的朋友,请看完整版。
Git版本库
git在创建版本库时,会自动生成一个.git隐藏目录,里面最重要的是称为stage的暂存区,Git创建的当前主分支名为 master,指向master的指针HEAD。
可以这样简单来理解,git add 把需要提交的文件修改通通放在暂存区,然后,git commit一次性提交暂存区的所有修改。Git这样设计的目的,为了跟踪并且管理文件的修改,关注点是文件的差异。每次对原始文件的修改,如果不add到暂存区中,那么commit操作就不会对其生效。
Git回退
Git必须知道当前版本是哪个版本,在Git中,使用HEAD表示当前版本,上一个版本为HEAD^,上上一个版本为HEAD^^。
举例:我们要把当前版本回退到上一个版本中去,可以使用git reset 命令
git reset –hard HEAD^
这个回退,会使得git log中,最新版本提交的日志消失。如果我们记得最新版本提交的commit id(前6位就足够了),可以使用
git reset –hard COMMIT_ID 来返回到最新版本,如果我们不记得最新版本的commit id,git提供了git reflog命令来记录你的每一次命令。
Git撤销修改和删除
使用git checkout -- file_name 可以撤销对该文件的修改。如果文件已经add,但是没有提交,可以先用 git reset HEAD file_name,把暂存区的修改撤销掉,然后用git checkout – file_name 丢弃对工作区的修改
Git忽略特殊文件,在Git根目录下创建一个特殊的.gitignore文件
选择忽略文件的原则是:
1. 忽略操作系统自动生成的文件,比如缩略图等
2. 忽略编译生成的中间文件、可执行文件等
3. 忽略带有敏感信息的配置文件,比如存放口令的配置文件。
不需要从头写.gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
Git远程仓库
在github上面创建一个git仓库,Github告诉我们,可以从这个仓库上克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到github仓库中去。远程仓库的默认名称为 origin,本地仓库的主分支默认名称为master
将本地仓库关联远程仓库的命令如下:
git remote add origin https://github.com/cherishui/learn_git.git //关联远程库和本地库
git push -u origin master // 首次将本地库的所有内容推送到远程库上去
git push origin master // 将本地master分支推送到远程origin分支上
git remote 查看本地仓库锁链接的远程库信息(-v 查看更加详细的信息)
添加远程仓库: git remote add [name] [url]
删除远程仓库: git remote rm [name]
修改远程仓库: git remote set-url –push[name][newurl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]
$ git push origin test:master // 提交本地test分支作为远程的master分支 ,那么远程origin下面就会多了master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支
例如 git push origin master:Program //是将本地master分支作为远程origin下面的名为Program的分支进行推送
git push origin :[name] //删除远程name分支
以后在本地分支的修改,只需要 git push origin master ,就可以将本地master分支的最新修改推送到GitHub分支上。
上述是先有本地库,后有远程库,如何将本地库关联远程库。下面介绍先有远程库,然后从远程库克隆到本地库来。
1. 现在github上面新建一个远程库,假设库名称为learn_git.git,在github页面上有相应的下载链接。
2. 然后本地新建一个文件夹,在文件夹中,执行 git clone git@github.com:cherishui/learn_git.git
我自己尝试用git协议下载库,下载失败,给出如下提示:
问题:没有在命令行中,添加操作的ssh公钥,因此显示没有权限操作。
解决三种方法:
第一种:通过ssh-keygen –C Email_addr –t rsa 生成密钥,将生成的id_rsa.pub告知GitHub,然后再通过git协议下载库就可以。
第二种:使用 https://github.com/cherishui/learn_git.git 协议下载就成功
第三种: 输入ssh git@github.com,如下图,
上述命令,表示本地已经信任git@github.com站点。
Git分支
Git最为人称道的功能,就是它强大的分支管理,无论是创建、切换和删除分支,Git在1秒钟之内就能够完成。
Git默认生产的分支叫做master分支。HEAD指针指向master,当master是当前分支时,HEAD就指向当前分支。
比如在当前的主分支master上,新建并且切换到dev分支后,Git内部创建了一个dev指针,并且指向master的位置,同时HEAD指针指向dev,表示当前工作分支在dev上。
如下图所示:
在dev分支,对工作区的修改和提交就是针对dev分支,每一次提交,dev分支往前移动一步,而master指针保持不变,如下图所示:
假如我们在dev上的开发工作完成,就可以将dev分支合并到master分支上去,git内部将master分支指向当前dev 的提交,就完成了合并。
完成dev分支上的开发,就可以删除dev分支,删除后的示意图如下:
创建dev分支 git branch dev 新分支创建后,不会自动切换到新分支去
切换到dev分支 git checkout dev
创建并且切换到dev分支 git checkout –b dev 新分支创建后,会自动切换到新分支去,相当于上面两个命令的集合
删除dev分支 git branch –d dev 默认情况下,没有合并的分支不能此命令删除,可以强行删除此分支 使用 git branch –D dev
查看本地分支 git branch
查看远程分支 git branch –r
如果是通过clone来下载一个库,再显示远程分支,会有如下显示:
创建远程分支 git push origin [name]
删除远程分支 git push origin : heads/[name]
合并分支dev到master : 先切换分支到master来,然后执行 git merge dev #将dev分支与当前分支合并。
使用—no--ff来合并分支 git merge --no-ff –m “修订记录” dev
Git鼓励大量使用分支, 高效且安全,本地分支和远程分支最好一致,保持开发的同步。
当分支合并有冲突时,通过git status来查看冲突文件情况,查看具体冲突的话,直接打开冲突文件就可以。
冲突实例:
根据实际需要,看是保留HEAD分支上的修改还是feature1分支上的修改,修改完毕后,必须重新add和commit。
合并完成后,删除feature1分支即可。
Git分支管理和多人协作
分支管理策略,在基于git的开发中,master分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活。开发时,都在dev分支上开发,等待开发稳定后,合并到master分支上,在master分支上发布1.0版本,建议在合并分支时,加上 –no--ff参数,以普通模式合并,合并后的历史log有分支的记录,这样可以清晰看到合并路线。
如果有bug的话,新建分支名称最好为 “bugfix-<bug编号>”,在此分支上修改, 修改好后,合并到本地master分支上。
如果同伴需要在远程origin库上的dev分支上开发,就必须创建远程origin库的dev分支到本地,使用如下步骤:
1. git checkout –b dev origin/dev #将远程库origin下的dev分支拷贝到本地
git checkout -b localBranchName origin/remoteBranchName ,在本地新建分支,并且与之关联到远程的分支,在这里,一般本地分支名称和远程分支名称设置成一样。
#在本地修改
git add && git commit –m “XXXX”
git push origin dev #将本地dev分支推送到远程库origin中去
如果自己在origin/dev分支上面也修改和提交了,在git push origin dev执行时,就会出现错误,解决方法很简单,
在本地,使用git pull把最新的提交从orgiin/dev上面抓取下来,在本地合并冲突后,在推送。
如果遇到:
那就是没有设置本地dev分支与远程origin/dev分支的链接。
在 git pull失败时,需要执行 git branch –set-upstream dev origin/dev #将本地dev分支与远程origin/dev分支建立链接
在 git pull出现合并冲突时,解决冲突,再次add和commit就可以。
或者新建一个分支,并且切换到此分支上,然后将本地分支与远程库的特定分支建立关联,使用命令 git checkout –b program
多人协作的工作模式通常是这样:
-
首先,可以试图用
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
。
这就是多人协作的工作模式,一旦熟悉,就非常简单。
一般来说,master分支是主分支,因此需要时刻与远程同步
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要远程同步
bug分支只用于在本地修复bug,修复完成后,合并到自己的本地dev分支就可以。
feature分支是否推送到远程,取决于是否与他人合作开发一项新的功能。
Git暂存功能
当修复bug时,又不想失去当前在dev分支上已经进行开发的工作,可以使用git stash命令来把当前工作现场“存储”起来,等以后恢复现场后继续现在的工作。
git stash list 查看当前的缓存区
git恢复工作现场有两种方法,
方法一:git stash apply 恢复,但恢复后,stash内容并不删除,你需要用git stash drop来删除
方法二:git stash pop,在恢复的同时,把stash的内容删除
推荐使用方法二。
Git标签
Git的标签和commit类似,类似于里程碑标记。在git中打标签很简单,首先切换到需要打标签的分支上,
执行 git tag –a v0.1 -m “标签的注释” 就可以在最新提交的commit上面打标签
如果要给制定的commit打上标签,首先需要通过git log找到需要的 commit id,例如id为6224937, 则执行git tag <name> 6224937 。
git tag 来查看当前所有标签,git show <tagname>用来查看此次标签的详细提交信息。
git tag –d v0.1 删除v0.1的标签
git push origin <tagname> 推送某个标签到远程
git push origin –tags
可以一次性推送全部未推送过的本地标签到远程
如果标签已经推送到远程,要删除远程标签v0.9,需要两步,先从本地删除
git tag –d v0.9
然后,从远程删除,删除格式如下:
git push origin :refs/tags/v0.9
Git日志
git log 查看当前提交历史记录
git log --pretty=oneline 每条commit只显示一行字符
--graph 查看分支合并图
--abbrev-commit 缩写commit id
git配置别名
git config –global alias.st status # 将status参数简写为st
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git优化显示log 别名设置,下面是高手的设置
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配置文件存放在.git/config文件中。每个用户的git配置存放在用户主目录下的隐藏文件.gitconfigi中。
GitHub开源协作开发
如何参与一个开源项目呢?
1. 访问你感兴趣的项目的github主页,点击Fork,在自己账户下clone一个仓库
2. 然后在本地执行 git clone ,将自己账户下的此仓库拷贝下来,以bootstrap为例子说明:
如果你想修复bootstrap下的一个bug,立即在本地库上干活,干完后往自己的仓库推送。如果你希望bootstrap官方库能够接收你的修改,你可以在github上面发起一个pull request,表示向官方库推送修订请求。
搭建Git服务器
搭建Git服务器点此进入:搭建Git服务器