假设我有一个本地Git仓库和一些未提交的更改。因为更改可能会非常混乱,所以我还不想提交到我的分支,但我确实想在云上测试它。我正在寻找一个git命令序列,它可以:1.将“混乱的更改”提交到另一个分支,例如mymessydev
mymessydev
git push origin mymessydev
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,您可以将messybranch或cherry-pick合并到master上的提交。
messybranch
master
cherry-pick
git merge messybranch
或
git cherry-pick #commit
cherry-pick或merge提交您的更改,但如果您希望它们被暂存而不提交,您可以这样做git reset head~1
merge
git reset head~1
lmvvr0a82#
我写了一个python脚本来自动化这个过程。它甚至适用于未跟踪的文件!首先安装python binding:pip install gitpython
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:])
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的某个分支提示或为你做这件事的某个便利命令将看到链接,
git symbolic-ref
git commit
HEAD
@
git checkout
git symbolic-ref HEAD
3条答案
按热度按时间stszievb1#
假设您位于主分支上,其中有混乱的更改。然后,
此时,您不会丢失这些更改,因为它们已经在
messybranch
上推送。为了将这些更改返回到master
,您可以将messybranch
或cherry-pick
合并到master
上的提交。或
cherry-pick
或merge
提交您的更改,但如果您希望它们被暂存而不提交,您可以这样做git reset head~1
lmvvr0a82#
我写了一个python脚本来自动化这个过程。它甚至适用于未跟踪的文件!
首先安装python binding:
pip install gitpython
dfuffjeb3#
这只依赖于一个不熟悉的核心命令
git symbolic-ref
。一个普通的git commit
always 更新HEAD
引用(也称为@
几乎无处不在)。Git有一个“symbolic ref”功能,它可以使一个ref成为另一个ref的替代名称,一种描述它所做的事情的方式是,它将一个ref“附加”到另一个ref。
当您
git checkout
一个分支的短名称时,这些便利命令使HEAD
成为该分支的符号引用。这就是检出分支的全部内容:HEAD
引用被附加到分支提示引用,对HEAD
的任何更新将改为更新提示引用,解析HEAD
的任何人将得到分支提示提交,任何人寻找HEAD
是否被附加到具有git symbolic-ref HEAD
的某个分支提示或为你做这件事的某个便利命令将看到链接,