根据 Git教程所总结的笔记。
Windows安装git
官网下载,直接安装,开始菜单栏输入Git Bash,弹出类似命令行的东西,说明安装成功!
安装完成后 进行设置 git认主:
$ git config --global user.name 'your name'
$ git config --global user.email 'XXX@XX.com'
创建版本库
- 可以选择你想要安装的目录处输入cmd,调出命令行,来创建一个空目录
- 也可以直接在刚才调出的Git Bash中,来创建一个空目录
- 后续的操作都可以在cmd中完成或者Git Bash中完成
第一步:
$ mkdir learnGit
$ cd learnGit
$ pwd
pwd命令用于显示当前目录。
第二步:
通过git init命令把这个目录变成Git可以管理的仓库
$ git init
添加文件到版本库
第一步:首先你要在learnGit目录下创建一个你要添加的文件。举个例子,添加的文件命名为“readme.txt”,内容为
Git is a version control system.
Git is free software.
第二步:用git add把文件添加到仓库
$ git add readme.txt
第三步:用git commit把文件提交到仓库,-m后输入的是本次提交的说明,可以是任意内容,方便阅读和改动文件
$ git commit -m 'wrote a readme file'
时光穿梭机
歪题:时光穿梭机这个名字挺有意思的,其实我也挺想回到以前,所有回不去的良辰美景都是举世无双的好风光~
- 刚才已经成功添加了readme.txt文件,然后我们继续修改,将文件内容修改成(第一行新增一个单词distributed):
Git is a distributed version control system. Git is free software.
- 使用git status命令可以查看仓库的当前状态(只知道被修改了,不知道改了啥,且知道文件是否被提交),此时文件只是被修改了,但还没有提交到仓库里。
$ git status
- 如果你想知道修改了哪些内容,则需要用到命令git diff 文件名
$ git diff readme.txt
- 修改完成后就可以使用git commit -m ‘add distributed’ 进行提交
$ git commit -m 'add distributed'
- 可以再次使用git status查看状态,此时仓库里没有需要提交的修改(nothing to commit),工作目录也是干净的(working tree clean)
$ git status
- 此时,我们可以不断的对文件进行修改,并提交到版本库里,假如改了三版,各版本内容如下:
- 版本1:wrote a readme file
Git is a version control system. Git is free software.
- 版本2:add distributed
Git is a distributed version control system. Git is free software.
- 版本3:append GPL
Git is a distributed version control system. Git is free software distributed under the GPL.
- 如果修改了千千万万个版本,怎么去记住?->git log命令可以告诉我们历史记录,git log --pretty=oneline 可以省略信息,并一行输出
$ git log $ git log --pretty=oneline
- 此时我们在版本3,如何乘坐时光机穿梭(git reset)到版本2呢?上一个版本可以表示为HEAD^ ,上上个版本可以表示为HEAD^^,上100个版本可以表示为HEAD~100。
$ git reset -- hard HEAD^
- 此时使用git log查看历史记录,版本3的记录已经没了,那么此时我们在版本2,又如何吃后悔药回到版本3呢?有两种后悔药可选,急速后悔药,慢性后悔药。
- 如果你还没有关掉命令行窗口,就可以通过git log结果里的commit id(一大串字符,只需要写前几个即可)进行回退
$ git reset --hard 1094a
- 如果你关掉了命令行窗口,才悔不当初,可以通过git reflog来找到删除的文件的commit_id。git reflog里面记录你的每一次命令:
$ git reflog
- 总结来说,HEAD指向的版本就是当前版本,使用命令git reset --hard commit_id可以在不同版本间来回穿梭
- 使用git log查看提交历史,以回到过去
- 使用git reflog查看命令历史,以回到未来
工作区和暂存区
- 工作区:电脑里能看到的目录
- 版本库:隐藏目录.git,里面含有stage(暂存区),Git自动创建的分支master,以及指向master的一个指针HEAD
- git add 实际上是把文件修改添加到了暂存区(stage)
- git commit 提交更改,实际上是把暂存区的内容提交到当前分支master上。
- 每次修改,如果不用git add到暂存区,就不会加入到commit中。
撤销修改
-
1.如果想直接丢弃工作区的修改时:
$ git checkout --file
-
2.如果你改乱了工作区某文件的内容,且将其添加到了暂存区,想丢齐修改:分两步
第一步:回到1$ git reset HEAD <file>
第二步:操作同1
删除文件
- git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库
-
关联远程仓库,关联远程仓库时必须给远程库指定一个名字,origin是默认习惯命名
$ git remote add origin git @server-name:path/repo-name.git
-
关联后使用命令 git push -u origin master 第一次推送master分支的所有内容
$ git push -u origin master
-
克隆仓库,必须知道你要克隆的仓库的地址
$ git clone <path>
分支管理
-
查看分支
$ git branch
-
创建分支
$ git branch <name>
-
切换分支
$ git switch <name> $ git checkout <name>
-
创建+切换分支
$ git switch -c <name> $ git checkout -b <name>
-
合并某分支到当前分支
$ git merge <name>
-
删除分支
$ git branch -d <name>
分支
解决冲突
当一个分支进行修改并提交后,主分支也进行修改提交,但修改后的两个分支无法快速合并,会产生冲突。此时我们必须先解决冲突,将Git合并失败的内容手动编辑成我们希望的内容,再提交。
- 查看分支合并图
$ git log --graph
分支策略
- master分支是非常稳定的,一般用来发布新版本,平时不在上面干活
- dev分支是不稳定的,平时在dev上干活,进行修改
- 最后进行合并,合并时加上–no–ff参数就可以用普通模式合并,即使用git log可以看到合并记录,而fast forward 默认合并就看不出曾经做过合并。这种模式下,删除分支后,会丢掉分支信息。
bug修复
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。
- 当手头工作没有完成时。先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop回到工作现场。
- 在master分支上修复的bug,可以通过git cherry-pick <commit> 命令,将bug提交的修改复制到当前dev分支上,避免重复劳动。
增加新功能
- 开发一个新feature,最好新建一个分支;
- 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除,注意是大写的D强行删除。
多人协作
-
要查看远程库的信息,用git remote, git remote -v可显示更详细的信息。
git remote
-
推送分支,把该分支上的所有本地提交推送到远程库里
git push origin master
-
需要远程合并的分支:
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。 -
多人协作的工作模式:
1.首先,可以试图用git push origin 推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
*如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。 -
小结:
1.从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
2.在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
3.建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
4.从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。