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

小结:如果工作区改崩了,应该如何恢复

  1. 如果没git add,那么只需要丢弃工作区修改,git checkout --filename,工作区回到上一次add或commit的状态
  2. 如果git add了,那么先撤销暂存区git reset HEAD filename
  3. 如果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>强行删除。

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用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教程

posted on 2023-01-02 15:23  肥兔子爱豆畜子  阅读(20)  评论(0编辑  收藏  举报

导航