Git 学习笔记
Git 学习笔记
Linux 操作系统的作者 Linus 用 C语言开发了分布式版本控制系统——Git。
所有的版本控制系统都只能跟踪文本文件的改动,比如 txt 文件、网页及所有的程序代码文件等。
集中式 vs 分布式
版本库又称仓库,英文名“repository”,可以简单理解为项目目录,其中的所有文件都会被 Git 管理起来。
集中式版本控制
集中式版本库集中存放在中央服务器,工作时先从中央服务器取得最新版本的内容到本地计算机,完成后再将本地计算机中的内容推送至中央服务器。
缺点:工作时必须联网,且网速受限时工作效率极低;容灾安全性低。
分布式版本控制
分布式版本控制系统中没有中央服务器概念,每台计算机中都保存完整的版本库,当不同计算机针对不同内容进行修改时,只需要将本机修改后的内容推送给其它计算机即可。由于每台计算机中都保存了完整的版本库,因此其容灾能力相比于集中式版本控制有了很大地提升。
为保证各种情况下的版本推送成功率,实际在使用分布式版本控制系统时通常也会存在一台充当“中央服务器”的计算机,但这台计算机的作用仅仅是为了方便交换各机器的版本修改,没有它本地机也同样可以正常工作,只是交换修改不方便而已。
本地仓库
安装
工作区与缓存区
-
工作区(Working Directory):本地项目目录;
-
版本库(Repository):工作区中的“.git”目录,其中包含暂存区“stage”和自动创建的第一个分支“master”。
创建版本库并提交修改
-
终端/命令行进入项目根目录;
-
使用
git init
命令初始化当前目录为一个 Git 仓库(目录中会增加一个隐藏目录“.git”);$ git init
-
对仓库中的文件进行添加/修改;
-
使用
git add
命令将修改添加到本地仓库暂存区(执行后无提示即代表成功);$ git add 文件名.扩展名
-
使用
git commit
命令将之前的全部修改**(暂存区中的内容)提交到本地仓库当前分支**。$ git commit -m "备注信息"
状态查看
使用git status
命令查看当前工作区及版本库的状态;
$ git status
使用git diff
命令查看具体文件修改的具体内容。
$ git diff 文件名.扩展名
撤销修改
使用git checkout
命令撤销工作区的全部修改(回到最近一次 git commit 或 git add 的状态);
$ git checkout -- 文件名.扩展名
使用git reset
命令撤销暂存区的全部修改并回退到工作区。
$ git reset HEAD 文件名.扩展名
版本回退
使用git log
命令查看 commit 历史纪录及对应版本库的版本号;
$ git log
使用git reflog
命令查看历史命令记录及对应版本库的版本号;
$ git reflog
使用git reset
命令回退分支版本(HEAD 表示当前版本,HEAD^ 表示上一个版本,HEAD~100 表示上一百个版本);
$ git reset --hard 版本号或HEAD^
Git 的版本回退速度非常快,因为 Git 在内部维护了一个指向当前版本的 HEAD 指针,当回退版本时仅仅是把 HEAD 从指向当前版本改为指向之前的某个版本,并更新工作区的文件而已。
删除文件
使用git rm
命令删除文件。
$ git rm 文件名.扩展名
远程仓库
连接
master 分支管理
使用git clone
命令从远程仓库克隆本地仓库;
$ git clone SSH地址
使用git remote
命令将本地仓库与远程仓库“origin”进行关联;
$ git remote add origin SSH地址
使用git remote
命令查看远程仓库;
$ git remote -v
使用git push
命令向远程仓库推送版本内容(首次使用加“-u”)。
$ git push -u origin master
非 master 分支管理
使用git checkout
命令从远程仓库克隆本地仓库;
$ git checkout -b 分支名 origin/分支名
使用“git branch”命令将本地仓库与远程仓库“origin”进行关联。
$ git branch --set-upstream-to=origin/分支名 分支名
分支管理
Git 会把每次提交都串成一条时间线,这条时间线就是一个分支,在 Git 里有一个分支叫主分支,即 master 分支。HEAD 严格来说不是指向提交,而是指向 master,而 master 指向提交,所以 HEAD 指向的是当前分支。
查看、创建、合并与删除分支
使用git branch
命令查看当前分支;
$ git branch
使用git branch
命令创建新分支;
$ git branch dev
使用git switch
命令切换到新分支;
$ git switch dev
使用git switch
命令创建新分支并切换当前分支;
$ git switch -c dev
Git 会新建了一个 dev 指针并指向与 master 相同的提交,再把 HEAD 指向 dev 就表示当前分支在 dev 上:
Git 创建一个新分支很快,因为除了增加一个新的分支指针并修改 HEAD 的指向,工作区的文件实则没有发生任何变化。
之后修改新分支 dev 的情况就类似于:
使用git merge
命令合并指定分支到当前分支;
$ git merge dev
实际就是将 master 指向 dev,因此速度也很快:
使用git branch
命令删除分支(“-D”为强制删除一个未被合并过的分支);
$ git branch -d dev
实际就是删除对应的分支指针 dev:
暂存与还原工作区
使用git stash
命令暂存工作区;
$ git stash
使用git stash list
命令查看暂存的工作区;
$ git stash list
使用git stash apply
命令恢复工作区;
$ git stash apply 暂存记录ID
使用git stash drop
命令删除暂存工作区内容;
$ git stash drop 暂存记录ID
使用git stash pop
命令恢复工作区并删除暂存工作区内容;
$ git stash pop
使用git cherry-pick
命令复制一次提交到当前分支。
$ git cherry-pick commit_id