git checkout 是一个用于在 Git 中切换分支、恢复文件或创建新分支的命令。它有几种常见的用法,请看下面的解释:
1.切换分支:您可以使用 git checkout 命令来切换到不同的分支。例如,如果您想切换到名为 develop 的分支,可以运行以下命令:
$ git checkout develop
这将使您的工作区和版本库中的文件与 develop 分支保持一致。
2.创建新分支:您可以使用 git checkout -b 命令一次性创建并切换到一个新分支。例如,如果要创建名为 feature-branch 的新分支并切换到该分支,可以运行以下命令:
$ git checkout -b feature-branch
这将同时创建 feature-branch 分支并将您切换到该分支上。
3.恢复文件:git checkout 命令还可以用于恢复单个文件或整个目录中的文件。例如,如果要恢复名为 file.txt 的文件到其最新的提交状态,可以运行以下命令:
$ git checkout file.txt
这将撤销对该文件所做的任何更改,并将其恢复到最近的提交状态。
注意:在使用 git checkout 命令时,请确保在执行操作之前没有未保存的更改,因为它可能会覆盖您的工作区中的文件。
在 Git 中,git reset 是一个用于将分支指针和索引重置到特定提交的命令。这个命令主要用于撤销提交、移动分支指针或取消缓存的更改。它有几种常见的用法,请查看下面的解释:
撤销提交并保留更改:通过使用 git reset 命令的 --soft 选项,可以将分支指针移动到目标提交,并且将之后的更改标记为待提交状态。例如,要撤销最近一次提交并将更改保留在工作区中,可以运行以下命令:
$ git reset --soft HEAD~1
这将将分支指针移动到上一个提交,并将最新提交的更改保留在暂存区和工作区中。
撤销提交并取消暂存的更改:通过使用 git reset 命令的 --mixed 选项(默认选项),可以将分支指针移动到目标提交,并取消将来自于目标提交以及之后的更改的暂存状态。例如,要撤销最近一次提交并取消之后的更改的暂存状态,可以运行以下命令:
$ git reset --mixed HEAD~1
这将将分支指针移动到上一个提交,并将最新提交及其之后的更改从暂存区中移除,但仍保留在工作区中。
撤销提交并丢弃更改:通过使用 git reset 命令的 --hard 选项,可以完全撤销目标提交及其之后的所有更改,并将分支指针和工作区都重置为目标提交。例如,要撤销最近一次提交并丢弃所有更改,可以运行以下命令:
$ git reset --hard HEAD~1
这将完全移除最新的提交及其之后的所有更改,包括暂存区和工作区中的内容。
请注意,git reset 是一个强制性操作,会更改 Git 的历史记录。因此,在使用 git reset 命令时,请确保您了解它会对您的项目产生的影响,并确保在执行操作之前进行适当的备份或确认。
在Git中,删除也是一个修改操作 ,我们实战一下,先添加一个新文件 test.txt 到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
[master b84166e] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用 rm 命令删了:
rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了, git status 命令会立刻告诉你
哪些文件被删除了:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit 提交:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
现在,文件就从版本库中被删除了。
ps: 先手动删除文件,然后使用git rm 和git add效果是一样的。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
该命令将在当前目录创建一个新的Git 仓库
git init
该命令将从远程仓库克隆一个仓库到本地
git clone repository_url
repository_url就是版本库地址
该命令将指定的文件添加到暂存区,准备进行提交
git add file_name
该命令将暂存区的更改提交到版本库,并附带一条提交消息
git commit -m "commit message"
该命令显示当前工作区和暂存区文件的状态
git status
该命令显示项目的提交历史记录
git log
该命令创建一个名为 branch_name的新分支
git branch branch_name
git checkout branch_name
#也可以直接加上 -b参数实现直接创建和切换
git checkout -b branch_name
该命令切换到指定的分支
该命令将指定的分支合并到当前分支
git merge branch_name
1.git pull 命令用于从远程仓库拉取最新的更改,并将其合并到当前分支。它实际上是 git fetch 和 git merge 两个命令的组合。
您可以在本地仓库所在的目录中运行以下命令来执行 git pull:
git pull
这将自动获取远程仓库的最新更新并将其合并到当前分支。如果存在冲突,您需要手动解决冲突。
2.请确保您当前所在的分支是您想要拉取和合并的分支。如果您只想要从特定的远程仓库和分支拉取更新,您可以使用以下命令:
git pull remote_name branch_name
将 remote_name 替换为远程仓库的名称(例如 "origin"),将 branch_name 替换为要拉取的分支的名称。
当使用 git pull -u 命令时,它的作用类似于 git pull,但还会添加一个额外的功能:设置分支的跟踪关系。例如,如果您在 main 分支上运行 git pull -u origin main 命令,它将从远程的 origin/main 分支获取最新代码,并将其合并到本地 main 分支。此外,-u 选项会将本地分支与远程分支建立起跟踪关系,以便在下次推送时更方便地使用 git push。
需要注意的是,-u 选项只需在第一次拉取并合并代码时使用,以后的拉取操作可以直接使用 git pull
git push 命令用于将本地的提交推送到远程仓库。它将本地分支的提交上传到与之关联的远程分支。
通常的语法是:
git push remote branch
其中,remote 是远程仓库的名称,branch 是要推送的分支名称。
以下是一些常见的用法:
1.将当前分支的提交推送到远程仓库:
git push origin main
上面的命令将当前分支 main 的提交推送到名为 origin 的远程仓库。
2.推送所有分支的提交到远程仓库:
git push --all origin
上述命令将本地所有分支的提交都推送到 origin 远程仓库。
3.强制推送更改:
git push --force origin main
使用 --force 选项可以强制推送更改,覆盖远程分支上的内容。请谨慎使用此选项。
4.推送标签:
git push --tags origin
上面的命令将本地所有标签推送到 origin 远程仓库。
请注意,推送之前,确保您已经进行了适当的提交,并且拥有推送权限。倘若远程仓库没给你权限你是推送不了的
使用 git push -u 命令可以在推送时同时进行分支关联,而无需事先手动指定关联。
当您执行
git push -u remote branch 命令时,Git 会将本地分支的提交推送到指定的远程仓库,并将本地分支与远程分支进行关联。这样做的好处是,在下一次推送时,您只需简单地运行 git push 命令,Git 就会自动推送到已关联的远程分支,无需再次指定远程仓库和分支。
例如,假设您当前位于本地仓库的 main 分支,并且想将其推送到名为 origin 的远程仓库的 main 分支上,您可以运行以下命令:
git push -u origin main
这将推送本地的 main 分支到远程仓库,并且 -u 选项会在推送的同时将本地分支与远程分支进行关联。以后,当您在 main 分支进行更多的提交后,只需运行 git push 命令,Git 就会将提交推送到已关联的远程 origin/main 分支上。
请注意,-u 选项只需在第一次推送时使用,以后就不再需要了。在每次推送后,Git 会自动记住关联信息。
git remote 用于管理 Git 仓库中的远程仓库。它允许您查看、添加、重命名和删除与本地仓库相关联的远程仓库。
以下是一些常用的 git remote 命令:
1.查看远程仓库:
git remote
该命令会列出本地仓库中配置的所有远程仓库的简称。
2.查看远程仓库的详细信息:
git remote -v
使用 -v 选项,可以显示远程仓库的 URL。
3.添加远程仓库:
git remote add name url
该命令会给远程仓库分配一个名称 并指定其 URL 。例如:
git remote add origin git@github.com:user/repo.git
4.重命名远程仓库:
git remote rename old_name new_name
通过该命令,您可以将已存在的远程仓库
5.移除远程仓库:
git remote remove name
该命令会移除指定名称的远程仓库。
这些命令可以帮助您管理与本地仓库相关联的远程仓库。请注意,以上命令只是一些常见用法的示例,Git 还有其他可用的选项和功能。
如果您需要更详细的信息,可以使用 git remote --help 命令查看 Git 官方文档或参考其他教程。
要将本地分支与远程仓库的分支进行关联,可以使用 git branch --set-upstream-to 或 git branch -u 命令。
假设您已经有一个本地分支,并且想要将其与远程仓库的同名分支进行关联。以下是关联的步骤:
git branch -vv
这将显示本地分支及其与之关联的远程分支。
git branch --set-upstream-to=/
或者使用简化的形式:
git branch -u /
请将 替换为远程仓库的名称(例如 origin)和 替换为要关联的远程分支的名称。
例如,如果要将当前的本地分支 main 关联到远程仓库 origin 的 main 分支上,可以运行以下命令:
git branch --set-upstream-to=origin/main
或简化形式:
git branch -u origin/main
git branch -vv
确保关联设置正确后,再次运行以上命令查看关联状态。
现在,您的本地分支就与远程仓库的分支成功关联起来了。在以后的操作中,您可以使用 git push 和 git pull 命令更方便地进行推送和拉取。
请注意,一般情况下,Git 会自动为您建立跟踪关系,尤其是在克隆远程仓库或者创建新分支时。但如果需要手动修改或创建关联关系,可以按照上述步骤进行操作
在上一个博客中,我们在gitee公共远程仓库进行了链接,如果不知道则么操作的可以移步至上一个博客。这一篇中我们将创建一个私人库来进行模拟工作场景。
首先,登陆Gitee,然后,在右上角找到“新建仓库”按钮,创建一个新的仓库:
在Repository name填入 learngit ,其他保持默认设置,点击“创建仓库”按钮,就成功地创建了一个新的Git仓库:
如果你跟着在上一个博客已经创建了本地库或者你自己有可以直接跳到步骤三
git config --global user.name "799"
git config --global user.email "[email protected]"
mkdir learngit
cd learngit
git init
git remote add origin git@gitee.com:lxsong77/learngit.git
请千万注意,把上面的 michaelliao 替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
添加后,远程库的名字就是 origin ,这是Git默认的叫法,也可以改成别的,但是 origin 这个名字一看就知道是远程库。
如果learngit目录(也就是本地版本库—有.git隐藏文件)中有文件就可以将本地文件用推送命令推送到远程库中
但是如果要想推送文件的话要进行以下步骤
git add
命令添加到暂存区中git commit -m
命令将其从暂存区添加到本地版本库的分支中 git push -u origin master
实际上把当前分支master推送到远程库中
推送成功后,可以立即在gitee页面中看到远程库的内容已经和本地一模一样
当两个分支对一个文件同一句话都做了改变,而且改变是不一样的。那么当合并两个分支时候,git会让你手动处理冲突之后才能合并。
而一般在远程库(例如gitee github)当中一般都是先要求你pull拉取更新保持跟远程仓库版本一致,再进行推送。否则git则会拒绝你的推送请求
下面来演示版本冲突:
准备新的 feature1 分支,继续我们的新分支开发:
$ git checkout -b feature1
Switched to a new branch 'feature1'
git branch feature1 #创建分支
git checkout feature1 #切换分支
git branch #查看分支
修改 readme.txt 最后一行,改为:
Creating a new branch is quick AND simple.
在 feature1 分支上提交:
$ git add readme.txt
$ git commit -m "AND simple"
[feature1 14096d0] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)
切换到 master 分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Git还会自动提示我们当前 master 分支比远程的 master 分支要超前1个提交。
在 master 分支上把 readme.txt 文件的最后一行改为:
Creating a new branch is quick & simple.
提交:
$ git add readme.txt
$ git commit -m "& simple"
[master 5dc6824] & simple
1 file changed, 1 insertion(+), 1 deletion(-)
现在, master 分支和 feature1 分支各自都分别有新的提交,变成了这样:
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
果然冲突了!Git告诉我们, readme.txt 文件存在冲突,必须手动解决冲突后再提交。 git
status 也可以告诉我们冲突的文件
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
我们可以直接查看readme.txt的内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git用 <<<<<<< , ======= , >>>>>>>
标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
再提交:
$ git add readme.txt
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed
现在, master 分支和 feature1 分支变成了下图所示:
用带参数的 git log 也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file
在实际开发中,我们应该按照几个基本原则进行分支管理:
所以,团队合作的分支看起来就像这样:
个人建议还是在实际中通过分支策略也就是开创自己的分支来专门更改文件,开创dev分支用来专门拉取更新,最后想要上传远程版本库的时候,只需要将dev与自己专门更改文件的分支进行合并上传就行
git本地仓库E:learngit中添加了另一个嵌套的git仓库 ,把嵌套的仓库作为子模块来管理。具体命令及流程
要将嵌套的仓库作为子模块来管理,您可以按以下流程进行操作:
git submodule add <子模块路径>
将 替换为嵌套仓库的远程仓库URL,将 <子模块路径> 替换为存放子模块内容的文件夹路径。
例如,如果嵌套仓库的远程URL是 https://github.com/example/nested-repo.git,在父仓库的根目录下执行以下命令:
git submodule add https://github.com/example/nested-repo.git nested-repo
cd <子模块路径>
git pull origin master
在父仓库中,会记录子模块的commit ID,以便后续可以确定所使用的子模块版本。
这样,您就成功地将嵌套的仓库作为子模块添加到父仓库中进行管理了。请确保在执行Git操作之前,您已进入正确的工作目录。
在使用子模块时,有几个需要注意的点:
git submodule init
git submodule update
git submodule update --remote --merge
这个命令将更新子模块到其远程仓库的最新提交,然后将子模块的最新版本合并到父仓库。
请注意,使用子模块时需要一定的小心操作,特别是在多人协作或跨团队开发中。确保所有成员理解如何使用和更新子模块,以避免潜在的冲突和问题。
git branch -d
git branch -d
git branch -D
请注意,在执行任何删除分支的操作之前,请确保您了解要删除的分支的状态,并确认不会丢失重要的更改。建议在删除分支之前进行代码备份或者创建一个新的分支以保存工作进度。
想要远程仓库也删除自己电脑中删除的文件就一定要提交删除操作
如果您希望撤销对 learngit 文件的更改并还原它的删除状态,请使用以下命令:
git restore --staged learngit
git restore learngit
要移除暂存区中的文件,您可以使用以下命令:
git rm --cached learngit
在Git中,您可以使用 git add 命令将文件从工作目录添加到暂存区(也称为索引),以便将其包含在下一次提交中。然而,有时候您可能误将某些文件添加到了暂存区。此时,您可以使用 git reset 命令来取消对这些文件的暂存操作。
具体地说,git reset HEAD learngit 的含义如下:
需要注意的是,git reset HEAD learngit 只会影响暂存区域,不会更改已提交的内容。如果需要撤销已提交的更改,请使用其他命令,例如 git revert 或 git checkout。
要查看父仓库中的子模块目录,您可以使用以下命令:
git submodule
运行该命令后,Git将列出父仓库中的所有子模块,显示子模块的路径、当前提交和子模块仓库地址。如果 learngit 是一个子模块,它将在列表中显示。
另外,如果您想进一步查看子模块的详细信息,可以使用以下命令:
git submodule status learngit
这将显示指定子模块(例如 learngit)的当前状态,包括子模块所在的路径、当前提交、子模块仓库地址以及子模块的最新提交。
git reset HEAD learngit 和 git rm --cached learngit 是两个不同的 Git 命令,它们的作用也不同。
需要注意的是,在运行 git reset HEAD learngit 或 git rm --cached learngit 后,learngit 文件仍然存在于您的本地工作区中,只是其状态发生了变化。如果希望完全删除该文件,还需要运行 git commit 记录这个删除操作,然后才能将其从 Git 仓库中移除。
这里所写的提交也就是用命令git log查看出来的历史记录!
799分支下的日志(起初)
看一下master分支的日志
在799上重演master分支,用git rebase命令
可以看到这个799分支上原来没有修改的b文件在重演之后进行了修改
下面用git merge命令进行操作
在master分支中创建i文件并提交
在dev中创建z文件和y文件并进行提交
dev中比master分支中中多了y文件与z文件,但少了i文件
用git merge命令合并查看日志
可以看到日志中多了 创建i文件这个一过程而且多了一个历史"Merge branch master into dev"
再切回master分支重演dev分支的,可以看到master分支下的日志的变化
也就是说如果没有版本冲突的情况下 git merge 与git rebase命令的结果是一样的
但是如果有版本冲突的情况下git merge 会多出一个合并历史,而git rebase不会。