Git

分布式版本管理工具。

分布式版本控制系统没有“中央服务器”,每个人电脑都是一个完整的版本库,这样在工作的时候就不需要联网了,多人协作只需要各自的修改推广给对方,就可以看到对方的修改了。

安装

Git - Downloads (git-scm.com),在官网下载,然后安装就可以了。

如果选择自解压,需要配置环境变量。

打开控制台窗口,输入git --version,成功输出版本号就意味着成功安装。

安装完成后,首先要做的事情是设置用户名和邮箱,每次Git提交都会使用该用户信息。

git config --global user.name "username"
git config --global user.email "example@example.com"

如果已经设置过,再次输入就可以覆盖之前设置的。

查看配置信息:

git config --global user.name
git config --global user.email

使用

获取本地仓库

要使用Git对代码进行版本控制,首先需要获得本地仓库。在需要管理的目录下,输入git init,完成后会在当前目录下生成一个.git隐藏目录。

基础操作指令

Git工作目录下对文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着指向Git的指令而变化。

image-20230821151709182

git status

查看文件状态

git add

将工作区未暂存或未跟踪的文件添加到暂存区。

可以在后面加文件名:git add filename.text

也可以使用通配符的方式:git add .。这个.就是通配符的意思,表示将目录下所有文件都添加到暂存区中。

git commit

将暂存区提交到仓库里。

使用方式:git commit -m "remark"。双引号里的内容修改。

git log

查看提交(commit)记录。

git long [option]

options:

  • -all 显示所有分支。
  • –pretty=oneline 将提交信息显示为一行。
  • –abbrev-commit 使得输出的commit更简短。
  • –graph 以图的形式显示。

git reset

版本回退

使用方式:git reset --hard commitID

这个commitID可以使用git log查看。那一串较长的十六进制就是commitID了。

commit ab8db8fb4fa5753e5c22a4d07ddde18f7b24753e (HEAD -> master, origin/master, origin/HEAD)

其中ab8db8fb4fa5753e5c22a4d07ddde18f7b24753e就是commitID,如果使用--abbrev-commit,只会显示前面几位,短的和长的效果一样。

git reflog

查看已输出的记录。

通常是使用了git reset回退了,又想再找回来,不过使用git log已经看不到被删除提交记录了,这时候就可以使用这个命令查看已经删除的提交记录。

.gitignore文件

这个文件可以告诉git那些文件不被管理。就是排除的意思。

分支

HEAD指向当前的分支。

git branch

查看分支

git branch 分支名

创建一个分支。

git checkout 分支名

切换分支

还可以直接切换到一个不存的的分支(创建并切换):git checkout -b 分支名

git merge 分支名

将指定的分支合并到当前分支。

git branch -d 分支名

删除分支,需要做各种检查。

git branch -D 分支名

强制删除分支。

git branch -vv

查看当前分支版本。如果关联了远端分支,也会显示远程分支版本。

解决冲突

当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时候就需要手动解决冲突。

  1. 处理文件冲突的地方。(会生成<<< HEAD)这种的字符,给这些生成的删除了,保留自己想要的。
  2. 将解决完冲突的文件加入暂存区(add)。
  3. 提交到仓库。

远程协作

为本地仓库添加一个远程参考

git remote add origin 远程仓库地址

其中origin是名称,不推荐修改。

输入git remote查看远程仓库。

推送到远程仓库

git push origin master。第一次会创建一个master的分支。

完整的命令:git push [-f] [--set-upstream] [远端名称] [本地分支名称]:[远端分支名]

  • 如果远端分支名和本地分支名相同,则可以只写本地分支名。
  • --set-upstream:推送到远端的同时并且建立起远端分支的关联关系。
  • -f:强制覆盖。
  • 如果当前分支已经和远端分支关联,则可以省略分支名和远端名。

获取远程仓库

git clone <仓库路径> [本地目录]

从远程仓库抓取和拉取

远程分支和本地分支一样,我们可以进行merge操作,只是需要先从远程仓库将更新都下载到本地,再进行merge操作。

  • 抓取命令:git fetch [remote name] [branch name]
    • 抓取指令就是将仓库里的更新都抓取到本地,不会进行merge。
    • 如果不指定远端名称和分支名,则抓取所有分支。
  • 拉取命令:git pull [remote name] [branch name]
    • 拉取指令就是将仓库里的更新都抓取到本地,且自动合并。等同于fetch + merge
    • 如果不指定远端名称和分支名,则抓取所有分支,并更新当前分支。

解决冲突

远程分支也是分支,方法与上文方法一样。

注:在push之前,先来一个pull。

其它

撤销commit

–mixed

git reset --mixed HEAD^

不删除工作空间提交的代码,撤销 commit,并且撤销 git add . 操作。

注意:-mixed 为默认参数。git reset --mixed HEAD^git reset HEAD^ 效果是一样的。

–soft

git reset --soft HEAD^

不删除工作空间提交的代码,撤销 commit,但不撤销 git add . 操作。

注意:仅仅是撤回提交,修改的代码仍然保留在本地仓库。

–hard

git reset --hard HEAD^

删除工作空间提交的代码,撤销 commit,并且撤销 git add . 操作。

注意:撤回后,本地提交的代码也不保留。就等于恢复到了上一次的 commit 状态。

  1. HEAD^ 的意思是上一个版本,也可以写成 HEAD~1。如果你进行了 22commit,想都撤回,可以使用 HEAD~2
  2. 如果只是 commit 注释写错了,只是想改一下注释,只需要执行 git commit --amend。此时会进入默认 vim 编辑器,修改注释完后保存即可。