git pull保留本地未提交的更改

mfuanj7w  于 2023-04-19  发布在  Git
关注(0)|答案(7)|浏览(226)

如何安全地更新(拉取)一个git项目,保持特定文件不变,即使上游有更改?
myrepo/config/config.php
有没有一种方法,即使这个文件在远程被更改,当我git pull时,其他所有内容都更新了,但这个文件没有改变(甚至没有合并)?
PS.我需要做我所要求的,因为我只编写基于git的部署脚本。我不能将配置文件更改为模板。
因此,我需要一种方法来编写更新脚本,不会丢失本地更改的内容。

git assume-remote-unchanged file1
git assume-remote-unchanged file2

然后git pull

t0ybt7op

t0ybt7op1#

有一个基于Git stash的简单解决方案。把你修改过的东西都藏起来,把所有新的东西都拉出来,然后应用你的stash。

git stash
git pull
git stash pop

在stash pop上可能会有冲突。在你描述的情况下,实际上会有config.php的冲突。但是,解决冲突很容易,因为你知道你放在stash中的是你想要的。所以这样做:

git checkout --theirs -- config.php
toiithl6

toiithl62#

我用

git pull -X ours

这将指示git在合并时使用本地版本。

bf1o4zei

bf1o4zei3#

如果你的仓库中有一个文件,它应该是由大多数提取器定制的,那么将该文件重命名为类似config.php.template的文件,并将config.php添加到你的.gitignore中。

44u64gxh

44u64gxh4#

假设:
1.你在分支上master
1.上游分支为origin中的master
1.您没有未提交的更改
你可以做:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

如果你需要经常这么做,你可以为它创建一个别名。注意,如果你有未提交的config/config.php更改,这将把它们扔掉。

zqry0prt

zqry0prt5#

我们也可以尝试使用git pull和rebase

git pull --rebase origin dev
8tntrjer

8tntrjer6#

如果它们是本地未提交的更改,则在拉取时避免合并冲突。

git stash save
git pull
git stash pop

参考-https://happygitwithr.com/pull-tricky.html

de90aj5v

de90aj5v7#

回答这个问题:如果要排除 checkout 的某些文件,可以使用sparse-checkout
1.在.git/info/sparse-checkout中,定义你想要保留的内容。这里,我们想要所有()但是(注意感叹号)config.php:
/
!/config.php
1.告诉git你想考虑稀疏 checkout
git config core.sparseCheckout true
1.如果您已经在本地获取了这个文件,那么就像git在稀疏 checkout 时所做的那样(告诉它必须通过设置“skip-worktree”标志来排除这个文件)
git update-index --skip-worktree config.php
1.享受您的config.php文件属于您的存储库-无论存储库上有什么更改。
请注意,配置值不应该在源代码控制中:

  • 这是一个潜在的安全漏洞
  • 它会导致部署出现这样的问题

这意味着您必须排除它们(在第一次提交之前将它们放入.gitignore),并在您 checkout 应用的每个示例上创建相应的文件(通过复制和修改“模板”文件)
请注意,一旦一个文件被git接管,.gitignore就不会有任何效果。
鉴于此,一旦文件处于源代码控制之下,您只有两个选择():

  • 重定所有历史的基以删除该文件(使用git filter-branch
  • 创建一个删除文件的提交。这就像打一场失败的战斗,但是,好吧,有时你不得不忍受。

相关问题