? 在使用 Git 前,了解 Git 对于之后的学习会有很大的帮助。
? Git 是一个分布式的版本控制软件,最初的目的是为了更好的管理 Linux 内核的开发。相比较于其它的软件版本控制系统,虽然总体上用起来与它们十分的相似,但是在对于信息的存储和认知上有很大的差异。主要体现在:
直接记录每个文件的快照,而不是进行差异的比较
几乎所有的操作都在本地执行
Git 可以保证完整性
Git 中的所有数据在存储前都会计算校验和,然后通过校验和来引用对应的版本。因此在文件有任何改动的情况下,Git 都能立即发现。
在每次提交后,Git 都会有一个校验和来引用对应的版本,因此在你执行提交之后,很难导致数据的丢失。
? 理解 Git 的几种状态对于学习是极其重要的,Git 总共分为三种状态:已修改(modified)、已暂存(staged)、已提交(committed)。
使用图来表示可能会直观一些:
请牢记这三种状态和这三个区,这是 Git 的核心。
一般的 Git 流程如下:
? 在使用 Git 前,需要配置一些相关的变量,如用户名、邮箱、默认文本编辑器等,只有配置了这些必须的属性,Git 才能正常使用。当然,Git 还有一些其它的配置信息,可以通过 git config --list --show-origin
来查看相关的配置属性以及所在的位置,但是 用户名、邮箱是必须配置的,因为 Git 在每次提交时都会将这些信息写入,并且这是不可更改的。
? 有两种方式可以设置这些属性:一是通过 git config --global user.name xxxx
和 git config --global user.emal xxxx@xx.com
;二是通过直接修改对应的配置文件。
? 这里以命令的方式进行配置为例:
# 配置用户名
git config --global user.name FatalFlower
# 配置用户邮箱
git config --global user.email GuiHuaLinked@gmail.com
默认文本编辑器的设置,当 Git 需要输入信息时将会调用它,如果没有配置的话,Git 会调用默认的文本编辑器。
# 设置 Git 的文本编辑器为 emacs
git config --global core.editor emacs
当在 Windows 上修改 Git 默认的文本编辑器时,需要指定执行程序的全路径。
初始化 或 clone
通过初始化的方式或者 clone
的方式都可以得到一个 Git 仓库。
初始化一个 Git 仓库(此时你应当已经进入了对应的项目目录)
# 初始化一个本地 Git 仓库
git init
? 这会在你的项目目录下创建一个 .git
文件夹,这是一个隐藏的文件夹,里面包含了 Git 仓库所必须的一些文件。
clone
一个 Git 仓库
git clone https://github.com/LiuXianghai-coder/tourism.git
? 这会将整个 tourism 仓库克隆到本地,同时还会将该仓库带有的 .git
文件夹 clone
下来,得到整个项目的提交历史和文件等其它的信息。
修改工作区的内容
? 在工作区(即你能够看到的项目目录中),对其中任意几个文件进行修改,此时 Git 会检测到文件的修改。如果在修改完几个文件之后运行 git status
可以看到当前的状态。看起来可能像下图这样:
? 此时的修改后的文件依旧存储在 工作区
将工作区的内容添加到暂存区
? 此时可以通过 git add *.txt
命令将当前工作目录下所有的 txt 文件都放入暂存区。再通过 git status
命令查看 Git 当前的状态。可能与下图类似:
? 注意此时修改后的文件处于 暂存区
提交暂存区内的文件快照
? 此时暂存区内有修改后的文件的快照,在未提交之前,这些快照依旧时不稳定的,因为它依旧有可能会丢失,因此最好的做法是将它们提交到本地仓库。
? 使用 git commit
命令可以将暂存区内的快照提交到本地仓库,此时提交将会强制要求输入本次提交的信息,也可以在命令后加上 -m
选项来输入本次的提交信息。但是一般来讲,还是建议使用 git commit
不带上 -m
选项,因为这会使得你能够更加详细地说明本次提交地内容。
? 执行完 git commit
命令,并且输入对应的提交信息后,再次运行 git status
命令查看 Git 的状态,可以看到工作区是干净的。
推送到远程服务器
? 之前讲过,Git 是一个分布式的软件版本控制工具,它的分布式就体现在这,客户端和服务端以及拉取这个仓库的客户端都会有这个仓库的 .git
文件夹。也就是说,以上这几个端都有对应的副本,因此对于软件版本控制来讲是极其安全的。只要即使拉取和推送了对应的仓库。
? 要推送本地的仓库到远程服务端,首先要添加它的上游分支:
# 在这里我将自己的一个 Github 仓库放到这里作为一个上游
git remote add origin https://github.com/LiuXianghai-coder/Test-Repo.git
? 此时通过 git remote --verbose
可以查看存在那些上游分支:
? 有了上游分支后我们就可以将我们本地的仓库推送到上游服务器上了 :)
? 使用 git push
命令可以将我们的仓库推送上去,具体命令如下:
# 这里需要注意的是,origin 是指定的上游分支名称,origin 是默认的一个上游分支,具体名称需要参考 `git remote --verbose` 命令下输入的上游名
# main 是上游的一个分支,其实 git 在这里做了一些简化,实际运行的命令是 `git push origin master:master` 将本地的 master 分支推送到上游 origin 的 master 分支。
# 具体的运行内容为 `git push 上游服务器名 本地分支:远程仓库分支`,如果远程仓库的分支名不存在,则会创建一个分支。
git push origin master
之后会要求输入用户名和密码,按照要求输入对应信息即可。
此时再查看对应的远程仓库,可以看到我们的文件已经被推送上去了。
如果你使提交的仓库不是一个空的仓库,那么可能会出现 类似以下的错误:
这是由于两个存储库之间没有公共的祖先,因此导致合并失败。
可选的解决方法是将两个存储库先在本地合并,然后再提交回去:
# origin 和 master 需要换成自己对应的上游和分支
# 使用 --allow-unrelated-histories 允许两个没有关联祖先节点的分支进行合并
git merge origin/master --allow-unrelated-histories
# 之后,再次提交即可
git push origin master
原文:https://www.cnblogs.com/FatalFlower/p/15120163.html