Git的重要概念简介
首先你需要安装Git,可以自行进行百度。
新手使用Git将本地的代码上传到远程仓库时,执行:
git add .
git commit -m "your message"
git pull
git push
这是日常使用Git最常用的四个命令,背后囊括了Git版本控制的原理。
git add .
:这个命令将所有未跟踪的文件和已修改的文件添加到 Git 的暂存区。"." 表示当前目录及其所有子目录。暂存区是一个预备提交的地方,你可以将你的更改分批次添加到暂存区,然后一次性提交。git commit -m "your message"
:这个命令将暂存区的更改提交到本地仓库。-m
参数允许你添加一个提交消息,这是一个描述你所做更改的简短说明。git pull
:这个命令从你的远程仓库拉取最新的更改,并将这些更改合并到你的当前分支。这个命令的目的是确保你的本地仓库和远程仓库保持同步。防止产生冲突。git push
:这个命令将你的本地仓库的更改推送到远程仓库。这意味着你的提交会被上传到远程仓库,其他人就可以看到和拉取你的更改。
图. git常用操作图解 (图来自菜鸟教程)
上述四个命令,就是从workspace到remote repository的过程。下面介绍一下Git 中的四个重要的概念。
- 工作区(Workspace):这是你可以看到和编辑的项目文件,也就是你打开IDE的项目所看到的文件。这些文件可能已经被 Git 追踪(也就是说,它们在上一次提交时就存在),也可能是新添加的文件(即,Git 之前并不知道它们)。
- 暂存区(Staging Area):也被称为 "索引",这是你预备提交更改的地方。当你执行
git add
命令时,你的更改将会被添加到暂存区。 - 本地仓库(Local Repository):这是在你的电脑上的一个数据库,保存了你所有的提交,包括提交的元数据(例如提交者、提交时间等)和与上一次提交的差异。这使得你可以查看你的项目的历史,或者恢复到一个早期的状态。仓库有多个分支,每个分支是项目的一个版本。简化来说,工作区是
- 远程仓库(Remote Repository):这是存在于网络上(例如 GitHub、GitLab、Bitbucket 等托管服务上)的仓库,可以与其他人共享。你可以将你的本地仓库的更改推送到远程仓库,也可以从远程仓库拉取更改到你的本地仓库。
在 Git 的工作流中,你通常会在工作区中编辑文件,然后将你的更改添加到暂存区,再将暂存区的更改提交到本地仓库,最后将本地仓库的更改推送到远程仓库。
远程仓库
你是如何从Github上下载代码的呢? 如果你是菜鸟,你可能直接从网站上下载一个Zip项目文件,再把文件解压缩,拖到IDE中。但熟悉Git的同学,往往是用clone命令,这两者有什么区别呢?
- 下载代码:当你下载代码时,你只是获取了仓库中某一特定时刻的快照,通常是主分支的最新状态。**你会得到一个包含了所有文件和目录的压缩包,但不包含Git的版本历史或其他元数据。**因此,你不能进行提交、拉取或推送操作,也不能查看历史记录或切换到不同的分支。简单来说,你只有代码,但没有Git的功能。
- 克隆仓库:当你克隆一个仓库时,你实际上是在本地创建了一个仓库的完整副本,包括所有的文件、目录、分支和版本历史。这使得你能够查看历史记录、创建和切换分支、进行提交、拉取和推送更改等。简单来说,克隆一个仓库使得你可以完全利用Git的功能进行版本控制。
下面来演示,如何从远程仓库克隆代码。
首先,需要使用配置SSH链接,将本地电脑和远程仓库连接起来。
-
打开终端:mac和windos都有相应的终端
-
生成新的SSH密钥:运行以下命令,将邮件地址替换为你在GitHub上注册的邮箱地址。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
当系统提示你"Enter a file in which to save the key"时,直接按回车键,接受默认文件位置(通常是
~/.ssh/id_rsa
)。然后,你会被提示输入一个密码,你可以选择输入一个也可以直接回车留空。 -
启动SSH Agent:运行以下命令来启动SSH Agent。
eval "$(ssh-agent -s)"
-
将新的SSH密钥添加到ssh-agent:运行以下命令将SSH私钥添加到ssh-agent。
ssh-add ~/.ssh/id_rsa
-
将新的SSH公钥添加到你的GitHub帐户:运行以下命令,将SSH公钥复制到剪贴板。
Windows:
clip < ~/.ssh/id_rsa.pub
Mac:
pbcopy < ~/.ssh/id_rsa.pub### Git的四个实体和常用命令
请先百度如何安装Git
使用Git将本地的代码上传到远程仓库时,执行:
git add .
git commit -m "your message"
git pull
git push
这是日常使用Git最常用的四个命令,背后囊括了Git版本控制的原理。
git add .
:这个命令将所有未跟踪的文件和已修改的文件添加到 Git 的暂存区。"." 表示当前目录及其所有子目录。暂存区是一个预备提交的地方,你可以将你的更改分批次添加到暂存区,然后一次性提交。git commit -m "your message"
:这个命令将暂存区的更改提交到本地仓库。-m
参数允许你添加一个提交消息,这是一个描述你所做更改的简短说明。git pull
:这个命令从你的远程仓库拉取最新的更改,并将这些更改合并到你的当前分支。这个命令的目的是确保你的本地仓库和远程仓库保持同步。防止产生冲突。git push
:这个命令将你的本地仓库的更改推送到远程仓库。这意味着你的提交会被上传到远程仓库,其他人就可以看到和拉取你的更改。
图. git常用操作图解 (图来自菜鸟教程)
上述四个命令,就是从workspace到remote repository的过程。下面介绍一下Git 中的四个重要的概念。
- 工作区(Workspace):这是你可以看到和编辑的项目文件,也就是你打开IDE的项目所看到的文件。这些文件可能已经被 Git 追踪(也就是说,它们在上一次提交时就存在),也可能是新添加的文件(即,Git 之前并不知道它们)。
- 暂存区(Staging Area):也被称为 "索引",这是你预备提交更改的地方。当你执行
git add
命令时,你的更改将会被添加到暂存区。 - 本地仓库(Local Repository):这是在你的电脑上的一个数据库,保存了你所有的提交,包括提交的元数据(例如提交者、提交时间等)和与上一次提交的差异。这使得你可以查看你的项目的历史,或者恢复到一个早期的状态。仓库有多个分支,每个分支是项目的一个版本。简化来说,工作区是
- 远程仓库(Remote Repository):这是存在于网络上(例如 GitHub、GitLab、Bitbucket 等托管服务上)的仓库,可以与其他人共享。你可以将你的本地仓库的更改推送到远程仓库,也可以从远程仓库拉取更改到你的本地仓库。
在 Git 的工作流中,你通常会在工作区中编辑文件,然后将你的更改添加到暂存区,再将暂存区的更改提交到本地仓库,最后将本地仓库的更改推送到远程仓库。
远程仓库
你是如何从Github上下载代码的呢? 如果你是菜鸟,你可能直接从网站上下载一个Zip项目文件,再把文件解压缩,拖到IDE中。但熟悉Git的同学,往往是用clone命令,这两者有什么区别呢?
- 下载代码:当你下载代码时,你只是获取了仓库中某一特定时刻的快照,通常是主分支的最新状态。**你会得到一个包含了所有文件和目录的压缩包,但不包含Git的版本历史或其他元数据。**因此,你不能进行提交、拉取或推送操作,也不能查看历史记录或切换到不同的分支。简单来说,你只有代码,但没有Git的功能。
- 克隆仓库:当你克隆一个仓库时,你实际上是在本地创建了一个仓库的完整副本,包括所有的文件、目录、分支和版本历史。这使得你能够查看历史记录、创建和切换分支、进行提交、拉取和推送更改等。简单来说,克隆一个仓库使得你可以完全利用Git的功能进行版本控制。
下面来演示,如何从远程仓库克隆代码。
首先,需要使用配置SSH链接,将本地电脑和远程仓库连接起来。
-
打开终端
-
生成新的SSH密钥:在Git Bash中,运行以下命令,将邮件地址替换为你在GitHub上注册的邮箱地址。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
当系统提示你"Enter a file in which to save the key"时,直接按回车键,接受默认文件位置(通常是
~/.ssh/id_rsa
)。然后,你会被提示输入一个密码,你可以选择输入一个也可以直接回车留空。 -
启动SSH Agent:在Git Bash中,运行以下命令来启动SSH Agent。
eval "$(ssh-agent -s)"
-
将新的SSH密钥添加到ssh-agent:运行以下命令将SSH私钥添加到ssh-agent。
ssh-add ~/.ssh/id_rsa
-
将新的SSH公钥添加到你的GitHub帐户:在Git Bash中运行以下命令,将SSH公钥复制到剪贴板。
Windows:
clip < ~/.ssh/id_rsa.pub
Mac:
pbcopy < ~/.ssh/id_rsa.pub
然后,打开GitHub网站,点击你的头像,选择"Settings"。在左侧菜单中,点击"SSH and GPG keys",然后点击"New SSH key"。在"Title"字段中,输入一个描述性的名字,比如"My PC"。在"Key"字段中,粘贴你的公钥。最后,点击"Add SSH key"。
这样就建立了ssh链接,本地电脑和远程仓库之间就畅通无阻了。
-
克隆GitHub仓库:现在,你可以使用
git clone
命令来克隆GitHub仓库。记住,你应该使用SSH URL来克隆仓库,它看起来像这样:git@github.com:username/repo.git
。你可以在GitHub仓库的主页上找到这个URL,点击"Clone or download"按钮,然后选择"Use SSH"。git clone git@github.com:username/repo.git
请将
username
和repo.git
替换为你的GitHub用户名和仓库名。
工作区、缓存区、本地仓库
工作区就是我们在IDE上看到的目录,通过git add
将工作区的内容添加到缓存区,再通过git commit
添加到缓存区。通过git checkout
可以将本地仓库的更新到工作区。git checkout
也是切换分支的命令,其实就是将本地仓库上对应的分支内容,加载到工作区。
除了上面提到的常见的命令,还有以下。
- 取消暂存文件
如果你想取消暂存某些文件,你可以使用 git reset
命令。例如,如果你想取消暂存名为 file1.txt
的文件,你可以运行:
git reset file1.txt
这将会把 file1.txt
文件从暂存区移出,但是文件的修改仍然保留。
- 取消所有暂存文件
如果你想取消所有暂存的文件,你可以运行:
git reset
这将会把所有文件从暂存区移出,但是文件的修改仍然保留。
- 放弃文件的修改
如果你想放弃对某个文件的修改,包括工作区和暂存区的修改,你可以使用 git checkout
命令。例如,如果你想放弃对 file1.txt
的修改,你可以运行:
git checkout -- file1.txt
这将会把 file1.txt
文件恢复到最后一次提交的状态。
- 放弃所有文件的修改
如果你想放弃所有文件的修改,你可以运行:
git checkout -- .
这将会把所有文件恢复到最后一次提交的状态。
注意:以上的 git checkout -- file
和 git checkout -- .
命令会丢弃所有未提交的修改,请确保你不需要这些修改或者已经做好备份。
分支
**分支:**是Git的大杀器,也是程序员日常的工作流之一。Git的分支功能非常强大,它允许你创建多个独立的开发线路,从而使得协同工作和特性开发更加容易和高效。
-
假设你正在一个项目中工作,该项目已经有一个
master
分支,你需要开发一个新功能,我们称之为new-feature
。你可以创建一个新分支来进行这项工作:git checkout -b new-feature
这个命令将创建一个名为
new-feature
的新分支,并立即切换到这个新分支。 -
在
new-feature
分支上,你可以进行开发工作,比如修改文件、添加新文件等。当你完成了一部分工作并想要保存当前的进度,你可以进行提交:git add . git commit -m "Add part of the new feature"
这将把所有更改添加到暂存区,然后创建一个新的提交。
-
假设你现在完成了
new-feature
的开发,你可以切换回master
分支,并将你的新功能合并到master
分支:git checkout master git merge new-feature
这将将
new-feature
分支的所有更改合并到master
分支。 -
一旦你的新功能被合并,并且你确认不再需要
new-feature
分支,你可以删除这个分支:git branch -d new-feature
这将删除
new-feature
分支。
上面演示的是在本地仓库上进行分支合并。在公司里,你需要连接远程仓库,把新分支推送到远程仓库,然后再和进行合并。
-
创建并切换到新的分支:
git checkout -b new-feature
这个命令将创建一个名为
new-feature
的新分支,并立即切换到这个新分支。 -
在
new-feature
分支上,进行开发工作,修改文件、添加新文件等。当你完成了一部分工作并想要保存当前的进度,你可以进行提交:git add . git commit -m "Add part of the new feature"
这将把所有更改添加到暂存区,然后创建一个新的提交。
-
将新功能推送到远程的
new-feature
分支:git push origin new-feature
注意:origin是远程仓库的名字,一般默认是origin。这个命令将创建一个新的远程分支(如果它还不存在),并将你的更改推送到这个远程分支。
-
在GitHub(或其他你使用的Git托管服务)上,你可以创建一个新的Pull Request,以将
new-feature
分支合并到master
分支。你可以在这个Pull Request中讨论更改,进行代码审查,等等。 -
一旦Pull Request被接受并合并,
new-feature
分支的更改就会被合并到master
分支。在这个点上,你可以选择在你的本地仓库和远程仓库中都删除new-feature
分支:git branch -d new-feature git push origin --delete new-feature
如何切换分支:
-
切换分支:使用
git checkout
命令可以切换到指定的分支。git checkout <branch-name>
这会将当前工作目录切换到指定的分支,让你可以在该分支上进行操作。
-
创建并切换到新分支:使用
git checkout -b
命令可以创建一个新的分支并立即切换到该分支。git checkout -b <branch-name>
这相当于同时执行了
git branch <branch-name>
和git checkout <branch-name>
。 -
查看分支:使用
git branch
命令可以查看所有的本地分支。git branch
当前分支会在列表中以特殊标记(通常是
*
号)标识出来。 -
查看所有分支
git branch -a
Git冲突
git add .
git commit -m "your message"
git pull
git push
前面举过例子,在将本地分支push到远程分支之前,要先执行pull操作。这是为什么呢? 主要有两个原因:
-
避免冲突:如果有其他人在你之前向远程仓库提交了修改,并且他们的修改和你的修改涉及到了同一部分代码,那么在你尝试推送你的修改时可能会发生冲突。如果你在提交之前先执行
git pull
,那么你可以在本地解决这些冲突,从而避免推送失败。 -
保持代码最新:如果其他人在你之前做了一些重要的修改(例如修复了一个 bug,或添加了一个新功能),那么你可能需要这些修改才能继续你的工作。执行
git pull
可以确保你的代码是最新的。然后,打开GitHub网站,点击你的头像,选择"Settings"。在左侧菜单中,点击"SSH and GPG keys",然后点击"New SSH key"。在"Title"字段中,输入一个描述性的名字,比如"My PC"。在"Key"字段中,粘贴你的公钥。最后,点击"Add SSH key"。
这样就建立了ssh链接,本地电脑和远程仓库之间就畅通无阻了。
-
克隆GitHub仓库:现在,你可以使用
git clone
命令来克隆GitHub仓库。记住,你应该使用SSH URL来克隆仓库,它看起来像这样:git@github.com:username/repo.git
。你可以在GitHub仓库的主页上找到这个URL,点击"Clone or download"按钮,然后选择"Use SSH"。git clone git@github.com:username/repo.git
请将
username
和repo.git
替换为你的GitHub用户名和仓库名。
工作区、缓存区、本地仓库
工作区就是我们在IDE上看到的目录,通过git add
将工作区的内容添加到缓存区,再通过git commit
添加到缓存区。通过git checkout
可以将本地仓库的更新到工作区。git checkout
也是切换分支的命令,其实就是将本地仓库上对应的分支内容,加载到工作区。
除了上面提到的常见的命令,还有以下。
- 取消暂存文件
如果你想取消暂存某些文件,你可以使用 git reset
命令。例如,如果你想取消暂存名为 file1.txt
的文件,你可以运行:
git reset file1.txt
这将会把 file1.txt
文件从暂存区移出,但是文件的修改仍然保留。
- 取消所有暂存文件
如果你想取消所有暂存的文件,你可以运行:
git reset
这将会把所有文件从暂存区移出,但是文件的修改仍然保留。
- 放弃文件的修改
如果你想放弃对某个文件的修改,包括工作区和暂存区的修改,你可以使用 git checkout
命令。例如,如果你想放弃对 file1.txt
的修改,你可以运行:
git checkout -- file1.txt
这将会把 file1.txt
文件恢复到最后一次提交的状态。
- 放弃所有文件的修改
如果你想放弃所有文件的修改,你可以运行:
git checkout -- .
这将会把所有文件恢复到最后一次提交的状态。
注意:以上的 git checkout -- file
和 git checkout -- .
命令会丢弃所有未提交的修改,请确保你不需要这些修改或者已经做好备份。
分支
**分支:**是Git的大杀器,也是程序员日常的工作流之一。Git的分支功能非常强大,它允许你创建多个独立的开发线路,从而使得协同工作和特性开发更加容易和高效。
-
假设你正在一个项目中工作,该项目已经有一个
master
分支,你需要开发一个新功能,我们称之为new-feature
。你可以创建一个新分支来进行这项工作:git checkout -b new-feature
这个命令将创建一个名为
new-feature
的新分支,并立即切换到这个新分支。 -
在
new-feature
分支上,你可以进行开发工作,比如修改文件、添加新文件等。当你完成了一部分工作并想要保存当前的进度,你可以进行提交:git add . git commit -m "Add part of the new feature"
这将把所有更改添加到暂存区,然后创建一个新的提交。
-
假设你现在完成了
new-feature
的开发,你可以切换回master
分支,并将你的新功能合并到master
分支:git checkout master git merge new-feature
这将将
new-feature
分支的所有更改合并到master
分支。 -
一旦你的新功能被合并,并且你确认不再需要
new-feature
分支,你可以删除这个分支:git branch -d new-feature
这将删除
new-feature
分支。
上面演示的是在本地仓库上进行分支合并。在公司里,你需要连接远程仓库,把新分支推送到远程仓库,然后再和进行合并。
-
创建并切换到新的分支:
git checkout -b new-feature
这个命令将创建一个名为
new-feature
的新分支,并立即切换到这个新分支。 -
在
new-feature
分支上,进行开发工作,修改文件、添加新文件等。当你完成了一部分工作并想要保存当前的进度,你可以进行提交:git add . git commit -m "Add part of the new feature"
这将把所有更改添加到暂存区,然后创建一个新的提交。
-
将新功能推送到远程的
new-feature
分支:git push origin new-feature
注意:origin是远程仓库的名字,一般默认是origin。这个命令将创建一个新的远程分支(如果它还不存在),并将你的更改推送到这个远程分支。
-
在GitHub(或其他你使用的Git托管服务)上,你可以创建一个新的Pull Request,以将
new-feature
分支合并到master
分支。你可以在这个Pull Request中讨论更改,进行代码审查,等等。 -
一旦Pull Request被接受并合并,
new-feature
分支的更改就会被合并到master
分支。在这个点上,你可以选择在你的本地仓库和远程仓库中都删除new-feature
分支:git branch -d new-feature git push origin --delete new-feature
如何切换分支:
-
切换分支:使用
git checkout
命令可以切换到指定的分支。git checkout <branch-name>
这会将当前工作目录切换到指定的分支,让你可以在该分支上进行操作。
-
创建并切换到新分支:使用
git checkout -b
命令可以创建一个新的分支并立即切换到该分支。git checkout -b <branch-name>
这相当于同时执行了
git branch <branch-name>
和git checkout <branch-name>
。 -
查看分支:使用
git branch
命令可以查看所有的本地分支。git branch
当前分支会在列表中以特殊标记(通常是
*
号)标识出来。 -
查看所有分支
git branch -a
Git冲突
git add .
git commit -m "your message"
git pull
git push
前面举过例子,在将本地分支push到远程分支之前,要先执行pull操作。这是为什么呢? 主要有两个原因:
- 避免冲突:如果有其他人在你之前向远程仓库提交了修改,并且他们的修改和你的修改涉及到了同一部分代码,那么在你尝试推送你的修改时可能会发生冲突。如果你在提交之前先执行
git pull
,那么你可以在本地解决这些冲突,从而避免推送失败。 - 保持代码最新:如果其他人在你之前做了一些重要的修改(例如修复了一个 bug,或添加了一个新功能),那么你可能需要这些修改才能继续你的工作。执行
git pull
可以确保你的代码是最新的。