理解git init

26

git init是用来创建一个新的Git仓库,可以针对每个项目执行一次。我通过git clone下载了我的项目并让它工作,但现在它还将我的项目存储到C:/Users/myUser/git这个路径下,我是否可以更改存储路径?

据我所知,这个文件夹似乎类似于一个本地Git仓库,但是谁来“管理”它,或者为什么要使用这个路径,请您给我解释一下。

以下是我的理解,请纠正我如果我有误:

  1. git init是针对每个项目进行的操作。
  2. "Users"目录下的git文件夹是本地仓库,并且每次执行git commit命令时,该文件夹都会被更新。
  3. 当我执行git push命令时,它会从本地仓库中获取代码并将其推送到远程仓库中。
  4. 当我想要更新到“HEAD”时,只需执行git pull.
5个回答

40
这实际上涉及到很多问题和误解。我不确定我能回答所有问题,所以我只会回答直接询问的内容。
  1. git init适用于每个项目

    几乎正确。git init用于在尚未使用git的项目上开始使用git。对于已经在git下的项目,您使用git clone

  2. "Users"文件夹下的git文件夹是本地代码库

    几乎正确。该文件夹实际上是.git而不是git。这源自unix惯例,所有以点开头的文件和文件夹都被视为隐藏文件。

    其次,该文件夹不在您的Users文件夹下。它在您的项目文件夹下。因此,文件夹C:/Users/myUser/是一个项目。如果这不是您的意图,那么您最有可能意外地在用户文件夹中执行了git init

    每个项目在项目的根目录中有一个.git文件夹,那就是项目的代码库。这是git比svn或cvs快得多的原因之一-整个代码库在本地硬盘上处理,没有任何网络流量。

  3. 当我执行git push时,它从本地代码库获取,并将其放入远程代码库中

    确切的说法是,对于具有远程代码库的代码库来说是正确的(这通常是通过使用git clone复制远程代码库创建的代码库)。

    请注意,远程代码库不需要在另一台机器上。您可以将一个项目从本地文件夹中git clone到另一个文件夹,然后可以将更改从新文件夹推回原始文件夹。

    git clone命令会自动设置必要的配置,以便您的代码库连接回远程代码库。但是,您也可以手动配置使用git init设置的代码库以连接到远程代码库。

  4. 什么“管理”它

    .git 文件夹管理您的项目存储库。Git 不作为服务器运行*。相反,.git 文件夹充当本地“服务器”,所有 Git 命令都与它通信。基本上,运行 Git 命令会编辑 .git 文件夹的内容。

    *注意:远程存储库确实运行了服务器,因此您可以连接到它们。但从技术上讲,它们不是真正的 Git 服务器。它们是 Git 可以从中下载和上传文件的文件服务器。


那么,当我在我的项目文件夹中输入 git commit 时,它会将我的新数据传输到也在我的项目文件夹中的 .git 文件夹中吗?或者它提交文件到哪里,因为 git push 将其发送到外部存储库。 - Jaanus
@Jaanus:没错。git commit 将最近的变更集从暂存区保存到 HEAD 中的 .git 文件夹中。git push 将远程仓库与您的 .git 文件夹同步,而 git pull 则将您的 .git 文件夹与远程仓库同步。 - slebetman

3

你的三个或四个理解基本正确,不过缺少一些细节。

git init 初始化(即创建)一个仓库。每个项目应该有自己的仓库。

如果你使用 git clone 下载了你的项目,则不需要再运行 git init

你应该可以将你的项目复制到另一个目录中而不会产生任何负面影响。那个路径可能是默认选择的。确保移动整个目录。Git 运行所需的元数据存储在项目目录中的隐藏文件中。

推送和拉取可能会变得复杂,特别是当你与他人合作开发项目并使用分支时。在此完整地介绍此主题并不明智,因此我建议您阅读Pro Git以获得更全面的解释。


2

git init 只用于当您从头开始创建自己的新存储库时。它将一个目录转换成一个空的git存储库。

当您使用git clone将现有存储库克隆到新存储库中时,没有必要也不需要使用git init


0

@Jaanus 关于 git pull,我想对 @slebetman 的解释补充一点。它并不是同步操作,而是获取本地没有的提交记录。这更像是一个边角案例,考虑以下情况 -

  1. 假设你正在处理一个名为 test_branch 的分支。在你的 git 服务器上,存在 A、B 和 C 三个提交记录,它们属于 origin/test_branch 分支,其中 C 是最新的提交记录。你已经拉取了这些提交记录,现在你的本地分支也有了 A、B 和 C。

  2. 假设由于某种原因,你必须重置提交记录 B 并强制重写 origin/test_branch 的历史记录,使历史记录变成 A 和 C。

  3. 现在当你在本地执行 git pull 命令时,它会显示 everything already up to date,但请注意,你有额外的提交记录 B。因此,不要将其视为同步操作,而应该将其视为“获取我没有的内容”的操作。

希望这能帮到你。


-1
#!bin/bash
DATE=`date +%m%d%Y.%H%M%S`
TARGET="$1.$DATE"
DIR=`pwd`


function batch_convert() {
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
batch_convert $1"/"$file
else
dos2unix $1"/"$file
#echo $1"/"$file
fi
done
}

##################

echo $TARGET
cd $DIR/DCW
git pull
cd ../
batch_convert DCW
cp -R DCW tmp/$TARGET
cd tmp/$TARGET
find . -type d -name "*git*"| xargs -n20 rm -rf



for db in `cat $DIR/tmp/$TARGET/Dblist` ; do
        echo "********** DB IS $db *******"
       for dbfolder in `find * -maxdepth 0 -type d` ;do
    echo `ls -a`
        echo "***** DBFolder is  $dbfolder *****"
    if [ ! $dbfolder = $db ];then
    cp -R $dbfolder $db
    find $db -name "*.ctl"| xargs -I '{}' mv '{}' $db/${db}.ctl
    fi
    done
done
cd ../
tar -cf $TARGET.tar $TARGET

这可能是一个很棒的答案,但是如果没有描述或评论,我不知道它是做什么的,也不知道它如何解决git问题。具体来说,这里发生了什么,为什么提交了这个答案?非常感谢。 - zipzit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接