Git命令将当前文件保存到临时分支中,而不提交到master

xdnvmnnf  于 12个月前  发布在  Git
关注(0)|答案(3)|浏览(108)

假设我有一个本地Git仓库和一些未提交的更改。因为更改可能会非常混乱,所以我还不想提交到我的分支,但我确实想在云上测试它。
我正在寻找一个git命令序列,它可以:
1.将“混乱的更改”提交到另一个分支,例如mymessydev

  1. git push origin mymessydev
    1.切换回具有相同未提交更改的主分支,就像什么都没有发生过一样。
stszievb

stszievb1#

假设您位于主分支上,其中有混乱的更改。然后,

git stash
git checkout -b messybranch
git stash apply
git add .
git commit -m "commit"
git push origin messybranch
git checkout master # clean master

此时,您不会丢失这些更改,因为它们已经在messybranch上推送。为了将这些更改返回到master,您可以将messybranchcherry-pick合并到master上的提交。

git merge messybranch

git cherry-pick #commit

cherry-pickmerge提交您的更改,但如果您希望它们被暂存而不提交,您可以这样做
git reset head~1

lmvvr0a8

lmvvr0a82#

我写了一个python脚本来自动化这个过程。它甚至适用于未跟踪的文件!
首先安装python binding:pip install gitpython

import sys
from git import Repo
import time

def save(temp_branch, repo_path='.'):
    repo = Repo(repo_path)
    git = repo.git
    work_branch = repo.active_branch.name

    ret = git.stash()
    is_stash = not 'No local changes' in ret
    # delete the temp branch if already exist
    try:
        git.branch('-D', temp_branch)
    except:  # the branch doesn't exist, fine.
        pass
    git.checkout('-b', temp_branch)
    if is_stash:
        git.stash('apply')
    git.add('.')
    try:
        git.commit('-m', 'temporary save ' + time.strftime('%m/%d/%Y %H:%M:%S'))
    except:
        print('no temporary changes to push')
    git.push('-f', 'origin', temp_branch)
    git.checkout(work_branch)
    git.cherry_pick('-n', temp_branch)
    print(git.reset('HEAD'))

save(*sys.argv[1:])
dfuffjeb

dfuffjeb3#

git checkout -b mymessydev                         # switch to new branch based here
git commit -am 'smoketest commit on WIP messydev'  # commit to that
git push origin messydev                           # push it
git symbolic-ref HEAD refs/heads/master            # pretend the above never happened

这只依赖于一个不熟悉的核心命令git symbolic-ref。一个普通的git commitalways 更新HEAD引用(也称为@几乎无处不在)。
Git有一个“symbolic ref”功能,它可以使一个ref成为另一个ref的替代名称,一种描述它所做的事情的方式是,它将一个ref“附加”到另一个ref。
当您git checkout一个分支的短名称时,这些便利命令使HEAD成为该分支的符号引用。这就是检出分支的全部内容:HEAD引用被附加到分支提示引用,对HEAD的任何更新将改为更新提示引用,解析HEAD的任何人将得到分支提示提交,任何人寻找HEAD是否被附加到具有git symbolic-ref HEAD的某个分支提示或为你做这件事的某个便利命令将看到链接,

相关问题