Git基础
Git基础
Git安装完了之后进行配置
$ git config --global user.name "lancerevo"
$ git config --global user.email "lixx@163.com"
创建repository
##在一个目录gitrepo执行
$ pwd
/Users/hayashihiroshi/gitrepo
$ git init
##查看隐藏目录,三个隐藏文件
$ ls -ah
. .. .git
git add 和git commit,添加和提交文件
$ git add readme.txt
$ git commit -m "add a txt file"
[master (root-commit) d286601] add a readme txt file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
修改文件后,用git status
查看,这时候文件的状态是“Changes not staged for commit”, 然后git add 之后状态“Changes to be committed”
git diff
readme.txt 查看文件有哪些没有add的变化( 执行完git add之后就不当作变化了,而不是git commit之后)
版本回退,用git reset --hard
git reset --hard HEAD^
git reset --hard HEAD^^
git reset --hard HEAD~10
git reset --hard e780619b56857ad8833044036db4dd6bdd1674ac
分别是回退上一版本,上上版本,往前的第10个版本,以及回退到指定commit id的版本
git log是版本日志,比如下面就是显示当前这个repository有3个版本,当前版本是最上面的
$ git log
commit e780619b56857ad8833044036db4dd6bdd1674ac (HEAD -> master)
Author: lancerevo <lixxx@163.com>
Date: Sun Jan 1 15:21:52 2023 +0800
add ..
commit 3fc58df1ec48aec6ce754fa61819c57b80fa22a5
Author: lancerevo <lixxx@163.com>
Date: Sun Jan 1 15:15:16 2023 +0800
add distributed
commit d28660148207522725953e97c5a85dd03d94d33d
Author: lancerevo <lixxx@163.com>
Date: Sun Jan 1 15:02:23 2023 +0800
add a readme txt file
$ git log --pretty=oneline
e780619b56857ad8833044036db4dd6bdd1674ac (HEAD -> master) add ..
3fc58df1ec48aec6ce754fa61819c57b80fa22a5 add distributed
d28660148207522725953e97c5a85dd03d94d33d add a readme txt file
commit id , Author, 提交时间,注释
git reflog是操作日志,记录了所有的命令操作
$ git reflog
e780619 (HEAD -> master) HEAD@{0}: reset: moving to e780619b56857ad8833044036db4dd6bdd1674ac
3fc58df HEAD@{1}: reset: moving to HEAD^
e780619 (HEAD -> master) HEAD@{2}: commit: add ..
3fc58df HEAD@{3}: commit: add distributed
d286601 HEAD@{4}: commit (initial): add a readme txt file
从头开始(按时间顺序),add了readme.txt,添加了distributed字,加了..,回退到HEAD^,然后又回到e780619
小结:如果工作区改崩了,应该如何恢复
- 如果没git add,那么只需要丢弃工作区修改,
git checkout --filename
,工作区回到上一次add或commit的状态 - 如果git add了,那么先撤销暂存区
git reset HEAD filename
- 如果git add并且commit了,那么使用
git reset --hard commit_id
回退到某一个版本
工作区、暂存区、版本库
在一个目录执行git init,这个目录就变成了工作区,里边的.git隐藏目录就是repository版本库
工作区 ——add——> 暂存区——commit——>分支
如上所示,版本库有暂存区(也叫stage或index)、以及后面的多个分支,这样两部分。工作区的内容在执行git add后会进入到暂存区,执行git commit后暂存区会提交到分支。很好理解。
远程仓库
本地生成ssh密钥对,把公钥id_rsa.pub配置到github上就行了。
$ ssh-keygen -t rsa -C "lixxx@163.com"
git remote add origin git@github.com:name/gitrepo.git
git clone
git push origin master
分支管理
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph
命令可以看到分支合并图。
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
Bug分支、feature分支、多人协作
修复bug
每次修复bug对应一个临时分支。修复后合并分支,然后将临时bug分支删除
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit-id>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-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
,如果有冲突,要先处理冲突。
标签
-
命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; -
命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息; -
命令
git tag
可以查看所有标签。 -
命令
git push origin <tagname>
可以推送一个本地标签; -
命令
git push origin --tags
可以推送全部未推送过的本地标签; -
命令
git tag -d <tagname>
可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
参与Github开源项目与Pull Request
如何参与开源项目:到github上Fork一下要参与官方的项目,这样相当于在自己的账号下clone了一份这个项目。然后就在自己仓库的这份项目上做修改。如果希望官方能接受你的优化,那需要在github上发起pull request、也即传说中的PR,如果官方接受,那就可以把修改的内容合并到官方项目了。
参考
廖雪峰老师的Git教程