我刚刚开始使用git(来自SVN),我确信我没有以正确的方式考虑这个问题 - 我从github克隆了一个存储库,并从中删除了标签并添加了我自己的。但是当我做一个git status或git diff时,它说没有什么可以提交的。难道不应该与我克隆的github项目进行比较吗?我知道这是错误的方式,但也许有人可以帮助我解决这个问题。
答案 0 :(得分:0)
标签指向它git的其他对象(通常是提交)。如果删除标签(通常不应该删除)或添加它们,则不会添加属于提交的任何内容,因此您无需提交任何内容。
您可能需要阅读the git object model。
答案 1 :(得分:0)
你 以错误的方式看待这个。
你需要做的就是忘记你对svn的了解。在svn中,您有一个存储库,它位于服务器上。您可以更改文件并提交它们的增量。
但是在git中,您的计算机上有一个存储库。如果你愿意,你也有一个在github上。处理您项目的其他人也会拥有自己的存储库。请注意我说的存储库。是!库!这意味着您拥有计算机中的所有历史记录。您可以在自己的计算机上提交,创建标记,分支,合并等所有内容,而无需在github中触及任何内容。
欢迎使用分布式版本控制系统。
与svn的另一个不同之处在于,您没有将提交视为增量,但是您将每个提交视为项目中的整个文件集。因此,例如,在git中不存在svn的奇怪合并(你说合并这个版本与我的文件的修订版之间的区别)。您只需合并该项目的快照。
Commit然后意味着将对文件的更改提交到您自己的存储库。创建标签是另一个过程。一个不会更改文件的进程(与创建标记的svn不同,这意味着复制文件)。 git中的标记只是指向特定提交的指针!
所以你想要做的是两件事:
提交:提交对存储库的更改。命令是
git commit
您可以使用git add some_file
将文件添加到提交中,并且只对源代码进行部分更改(这是svn无法获得的)。或者,如果要提交所有已更改的文件,请添加-a
选项。
推送:推送发送到另一个存储库,假设一个名为origin(指向github)的远程存储库,就是您在自己的存储库中拥有的所有存储库。这包括所有提交,如果您还指定了-tags
您创建的标签。例如:
git push origin master -tags
或者,当您想要从源更新存储库时,您首先要:
获取:将您的存储库更新为远程存储库。着名的:
git fetch origin
这会带来origin
但不存在于本地存储库中的所有新提交和标记。
合并:然后将您的主分支更新为远程分支:
git merge remotes/origin/master
回到你的情况,没有什么可以提交,但你需要推送标签。最后要告诉您的是,当您删除标签时,只能从您自己的存储库中删除它们。要从遥控器中删除它:
git push origin :refs/tags/tag_name
理解这种语法需要更高级的git push教程,但现在接受这个。请注意,删除标签非常不受欢迎。这是因为如果有人下载该标签并开始使用它并依赖它,那么如果她需要它,她将无法再找到它。因此,在创建标签时,请确保软件/库是您希望的那样。