在新 Git 分支中创建新文件
Creating a new file in a new Git branch
我还在试验 Git。
现在我在 Gitlab 上只有一个本地 master
分支和一个远程 origin/master
分支。
到目前为止我做了什么:
- 在
master
上编写一些新代码
- 运行
git commit -m "added something new"
- 运行
git push origin master
我想创建一个新分支,所以我做了:
git checkout -b newBranch
执行此命令后,我已经 "checked out" 在我的新分支上了,对吧?我可以用 git branch -a
确认
所以我创建了一个新文件(使用 VSCode 文件资源管理器)example.txt
(在我的新分支上)。
然后我做了:
git checkout master
所以我可以回到我的 master
分支。
那时我预计我将无法再看到该文件,因为它是使用不同的分支创建的。但是文件还在。
我错过了什么?
您创建的文件尚未暂存或提交,因此它是一个未跟踪文件。未跟踪的文件尚不属于任何分支;它们存在于您的工作树上,并在您从一个分支切换到另一个分支时保留在那里。
(要完全理解这一点,熟悉 git 中的三个通用存储区域可能会有所帮助 - 工作树、索引(有时称为暂存区)和数据库。详细了解这有点超出了回答这个问题的范围,但我确实建议阅读这个主题。)
伴随着一句警告:在一个分支上提交的文件在另一个分支上可能不存在。例如,如果您返回 newBranch
并提交您的文件
git checkout newBranch
git add example.txt
git commit
现在 example.txt
存在于 newBranch
但不存在于 master
。如果您签出 master
,该文件将如您所料消失。
这意味着如果您在 master
上创建另一个 example.txt
(在同一目录中以便路径完全相同),即使路径相同,这个新文件也不会被跟踪引用另一个分支上现有的已提交文件。
如果您随后尝试结帐到 newBranch
git 应该拒绝并警告您有数据会因结帐而丢失。
实际上,这只是 "trying to change branches with uncommitted changes" 的一个特例,但考虑到您当前的任务,值得一提。
另一个可能的解决方案:
您可以使用 git 的 stash 命令。
git stash 有什么作用?
git 存储用于您的更改的剪贴板。
如果您必须切换上下文 - 例如因为你需要解决一个紧急的错误——你需要把这些改变排除在外。当然,您不应该只提交它们,因为这是未完成的工作。
示例:
git stash
您的工作副本现在是干净的:所有未提交的本地更改都已保存在 Git 的 Stash 所代表的这种 "clipboard" 上。您已准备好开始新任务(例如,通过从远程拉取更改或简单地切换分支)。
假设:
- 您在分支 newBranch 上创建了一个文件 example.txt。
现在急需切换另一个分支master,然后在切换之前应用以下命令。
git 添加 example.txt
git 存储
现在切换master。那么example.txt文件就会消失
当你返回你的分支 newBranch 然后应用以下命令。
git 隐藏应用
然后你可以看到你的文件 example.txt.
我还在试验 Git。
现在我在 Gitlab 上只有一个本地 master
分支和一个远程 origin/master
分支。
到目前为止我做了什么:
- 在
master
上编写一些新代码
- 运行
git commit -m "added something new"
- 运行
git push origin master
我想创建一个新分支,所以我做了:
git checkout -b newBranch
执行此命令后,我已经 "checked out" 在我的新分支上了,对吧?我可以用 git branch -a
所以我创建了一个新文件(使用 VSCode 文件资源管理器)example.txt
(在我的新分支上)。
然后我做了:
git checkout master
所以我可以回到我的 master
分支。
那时我预计我将无法再看到该文件,因为它是使用不同的分支创建的。但是文件还在。
我错过了什么?
您创建的文件尚未暂存或提交,因此它是一个未跟踪文件。未跟踪的文件尚不属于任何分支;它们存在于您的工作树上,并在您从一个分支切换到另一个分支时保留在那里。
(要完全理解这一点,熟悉 git 中的三个通用存储区域可能会有所帮助 - 工作树、索引(有时称为暂存区)和数据库。详细了解这有点超出了回答这个问题的范围,但我确实建议阅读这个主题。)
伴随着一句警告:在一个分支上提交的文件在另一个分支上可能不存在。例如,如果您返回 newBranch
并提交您的文件
git checkout newBranch
git add example.txt
git commit
现在 example.txt
存在于 newBranch
但不存在于 master
。如果您签出 master
,该文件将如您所料消失。
这意味着如果您在 master
上创建另一个 example.txt
(在同一目录中以便路径完全相同),即使路径相同,这个新文件也不会被跟踪引用另一个分支上现有的已提交文件。
如果您随后尝试结帐到 newBranch
git 应该拒绝并警告您有数据会因结帐而丢失。
实际上,这只是 "trying to change branches with uncommitted changes" 的一个特例,但考虑到您当前的任务,值得一提。
另一个可能的解决方案:
您可以使用 git 的 stash 命令。
git stash 有什么作用?
git 存储用于您的更改的剪贴板。
如果您必须切换上下文 - 例如因为你需要解决一个紧急的错误——你需要把这些改变排除在外。当然,您不应该只提交它们,因为这是未完成的工作。
示例:
git stash
您的工作副本现在是干净的:所有未提交的本地更改都已保存在 Git 的 Stash 所代表的这种 "clipboard" 上。您已准备好开始新任务(例如,通过从远程拉取更改或简单地切换分支)。
假设:
- 您在分支 newBranch 上创建了一个文件 example.txt。
现在急需切换另一个分支master,然后在切换之前应用以下命令。
git 添加 example.txt
git 存储
现在切换master。那么example.txt文件就会消失
当你返回你的分支 newBranch 然后应用以下命令。
git 隐藏应用
然后你可以看到你的文件 example.txt.