2016-06-27 16 views
2

私はGitPythonライブラリを使って簡単なGit操作を行いました。ブランチをチェックアウトし、コミットしてから前のブランチをチェックアウトしたいと思います。ドキュメントはこれを行う方法を少し混乱させます。これまでのところ、私はこれを持っている:GitPythonでブランチをチェックアウトしています。コミットして前のブランチに戻す

import git 
repo = git.Repo() 
previous_branch = repo.active_branch 
new_branch_name = "foo" 
new_branch = repo.create_head(new_branch_name) 
new_branch.checkout() 
repo.index.commit("my commit message") # this seems wrong 
## ????? 

私は、これはgitのコマンドを経由して、それを検証することによって動作することを伝えることができますが、私は私が間違ってこれをやっている感覚を得ます。私は以前のブランチに戻って、生のgitコマンドを(ライブラリ内から直接)安全に並べ替える方法ではありません。 http://gitpython.readthedocs.io/en/stable/tutorial.html

から

答えて

4

Gitチェックアウトに似た枝を切り替えるには支店に

を切り替えるには、効果的に新しいブランチにあなたの頭のシンボリック参照を指すと一致させるために、あなたのインデックスと作業コピーをリセットする必要があります。それを行うための簡単な手動の方法は残酷にかかわらず、作業コピーとインデックス内のユーザの変更を上書きする1

# Reset our working tree 10 commits into the past 
    past_branch = repo.create_head('past_branch', 'HEAD~10') 
    repo.head.reference = past_branch 
    assert not repo.head.is_detached 
    # reset the index and working tree to match the pointed-to commit 
    repo.head.reset(index=True, working_tree=True) 

    # To detach your head, you have to point to a commit directy 
    repo.head.reference = repo.commit('HEAD~5') 
    assert repo.head.is_detached 
    # now our head points 15 commits into the past, whereas the working tree 
    # and index are 10 commits in the past 

前のアプローチを以下とgitのチェックアウト未満洗練されています。後者は一般的にあなたの仕事を破壊するのを防ぎます。次のように、より安全なアプローチを使用してください。ちょうどその下に

# checkout the branch using git-checkout. It will fail as the working tree appears dirty 
    self.failUnlessRaises(git.GitCommandError, repo.heads.master.checkout) 
    repo.heads.past_branch.checkout() 

または、: それはラップされていないとして、あなたは機能が不足している場合はgitの直接 を使用して、あなたは便利な直接のgitコマンドを使用することができます。各リポジトリインスタンスが所有します。

git = repo.git 
    git.checkout('HEAD', b="my_new_branch")   # create a new branch 
    git.branch('another-new-one') 
    git.branch('-D', 'another-new-one')    # pass strings for full control over argument order 
    git.for_each_ref()        # '-' becomes '_' when calling it 

そして単にはgit.checkout()アプローチ

+0

'repo.head.reference = repo.commit(someSHA)'と言う 'gitのチェックアウトsomeSHA'の違いは何であるのか?私はrefがpythonを使っているときにHEADとmasterを指しているが、git cliを使うときはHEADだけであることが分かる。作業ディレクトリがPython経由で使用されているときにはダーティであることを意味します。どのように私は分離状態で終了し、pythonツールを使用してきれいにすることができますか? – DanCat

関連する問題