在git中,是否可以创建一个存储库,将存储库推到远程存储库,在另一台计算机上检索存储库,并应用存储库?
或者我的选择是:
创建补丁并将补丁复制到另一台计算机,或者 创建一个小分支并将未完成的工作提交给该分支?
在git中,是否可以创建一个存储库,将存储库推到远程存储库,在另一台计算机上检索存储库,并应用存储库?
或者我的选择是:
创建补丁并将补丁复制到另一台计算机,或者 创建一个小分支并将未完成的工作提交给该分支?
当前回答
我会选择第二种方法,尽管不知道为什么不能提交给main/feature分支。也有可能进行“樱桃挑选”。
其他回答
有点晚了,但这个答案可能会帮助到一些人。我之所以想知道这些,是因为我想在同一时间点在另一台电脑上发布正在开发的功能/bug/任何东西。
对我有效的是提交我正在进行的代码(在我独自处理的分支中)。当我到达另一台计算机时,执行拉取,然后撤销提交:
git reset --soft HEAD^
继续像以前那样工作,所有正在进行的更改都在那里,没有提交,也没有分期。
希望能有所帮助。
我想,藏东西的意思就是把一些不那么重要的东西藏在当地的地毯下面。没有人应该知道你最喜欢的废话;-)唯一的“但是”是:但是如果我在几个工作站上开发呢?那么scp就更好了。
下面的代码不适用于隐藏,但适用于工作目录中未提交的更改。它创建一个分支,自动提交所有当前的更改,并推送到远程:
commit_and_push_ ( ) {
# This will:
# 1. checkout a new branch stash-XXX
# 2. commit the current changes in that branch
# 3. push the branch to the remote
local locbr=${1:-autostash-XXX}
git checkout -b $locbr
git add .
git commit -a -m "Automatically created commit"
git push origin $locbr
echo "Autocommitted changes in branch $locbr ..."
}
使用:
commit_and_push_ my-temp-branch
commit_and_push_
我有点晚了,但我相信我找到了一些适合我的东西,如果你的情况相同或相似,它可能也适用于你。
我在它自己的分支里做一个特性。分支不会合并到master中并推送,直到它完成或者我已经提交了我觉得可以向公众展示的内容。所以当我想要将非阶段性的更改转移到另一台计算机时,我所做的是:
Make a commit, with a commit message like "[non-commit] FOR TRANSFER ONLY", featuring the content you want transfered. Login to the other computer. Then do: git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb The URL might differ for you if you access your repository in a different way. This will pull changes from that URL from the remote branch "rb" into the local branch "lb". Note that I have an ssh server running on my own computer, and am able to access the repository that way. git reset HEAD^ (implies --mixed) This resets the HEAD to point to the state before the "[non-commit]" commit.
从git-reset (1): "——mixed:重置索引,但不重置工作树(即,更改的文件被保留,但不标记为提交)[…]"
因此,您最终将对文件进行更改,但不需要提交到master,也不需要存储。
然而,这将需要你git重置——在你做了“[非提交]”的存储库中硬HEAD^,因为那个提交是垃圾。
目前接受的答案在技术上是正确的,您不能直接告诉Git将您的所有存储文件推到远程,然后将所有文件拉到另一台计算机上的本地存储文件中。
虽然目前投票最多的答案应该是有效的,但我不喜欢它创建了一堆临时分支,它需要手动检查stash提交并将其保存为一个stash,这可能会导致像这个评论提到的问题,并导致重复的On(无分支):On测试:。肯定有更好的办法!
因此,虽然你不能直接推送存储,但一个stash只是一个提交(实际上是两次提交),并且根据git推送手册页,你可以推送提交:
<src>通常是你想要推送的分支的名称,但它可以是任意的“SHA-1表达式”…
我选择将存储推到refs/stashes/*,这样我就不会因为额外的分支而使遥控器变得混乱。我可以用:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
(rev-parse命令获取储存的短散列,这对于回购是唯一的。)
接下来,我需要从另一台计算机获取存储。Git默认只获取分支,所以我需要获取具体的存储:
git fetch origin refs/stashes/*:refs/stashes/*
现在要将存储提交转换回实际的存储。如前所述,虽然我可以像往常一样检出存储提交、重置和存储,但我不喜欢它需要额外的步骤,或者它可能无法维护存储的索引状态。我在网上寻找一种自动搜索的方法,但我的搜索失败了。最后,我查看了git stash的手册页,在那里我发现了这个:
创建 创建一个stash(这是一个常规提交对象)并返回其对象名称,而不将其存储在ref名称空间中的任何位置。这对脚本很有用。这可能不是你想要使用的命令;参见上面的“保存”。 商店 将通过git stash create(这是一个悬空合并提交)创建的给定stash存储在stash ref中,更新stash reflog。这对脚本很有用。这可能不是你想要使用的命令;参见上面的“保存”。
因为我已经有了提交,所以存储听起来就是我想要的。所以我可以这样做:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
将<SHA>替换为刚获取的存储。
(git show命令从存储提交中获取提交消息,用作存储日志的消息。)
藏匿现在显示正常在我的本地回购:
$ git stash list
stash@{0}: On master: temp
...
要清理远程,可以像这样从远程删除存储:
git push origin :refs/stashes/<SHA>
此方法还有幂等性的好处:如果再次运行push命令,它将报告最新的Everything。fetch命令也可以安全地重复执行。虽然存储库将跳过存储与最新存储库相同的存储库,但它不能防止旧存储库的副本。不过,这可以解决,就像我在git-rstash脚本中所做的那样,请参见下面。
为了完成,你还可以轻松地推送所有的存储(使用bash):
for i in $(seq 0 $(expr $(git rev-list --walk-reflogs --count stash) - 1))
do
git push origin stash@{$i}:refs/stashes/$(git rev-parse --short stash@{$i})
done
或者导入所有获取的存储:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
我已经创建了一个bash脚本,可以作为子命令调用(例如git rstash push 0),所以我不需要记住这一切。Git-rstash可以在这里找到。