git分支和合并

时间:2012-02-09 05:55:28

标签: git

我正在试着理解git中的分支。我已经使用SVN,所以试图获取目录结构

我用

创建一个git主回购
mkdir git_repo
cd git_repo
git init --bare
cd ../
git clone git_repo new_clone
cd new_clone
touch test.txt
git add test.txt
git commit test.txt
git push origin master
//So now the contents are in git_repo
git branch new_branch
git branch 
/*master
*new_branch is the output */
git checkout new_branch
//Switched to branch 'new'

我的问题是

1.如何切换回new_clone

2.如何将文件从分支推送到new_repo

3.如何在new_branch和new_clone

中看到文件中的差异

4.如何将文件推送到git_repo

5.我在这种情况下使用合并

6.如何单独列出new_branch和new_clone中的文件

任何人都可以用例子来解释这些。

谢谢..

2 个答案:

答案 0 :(得分:0)

  1. 您无法“切换回new_clone”,因为new_clone不是分支。您有一个包含两个分支的存储库,名为masternew_branch。 “切换到[存储库路径]”是什么意思?
  2. 我认为您在这里要问的是“我如何在[{1}}中检索对git_repo的提交到我的工作副本?”答案是您执行new_clone检索更改,git fetchgit merge将其合并到本地(或git rebase在一次操作中执行这两项操作)。
  3. git pull。对于特定文件git diff new_branch new_clone。对于变更集方面的差异,而不是补丁格式,请使用git diff new_branch:path/to/file new_clone:path/to/file等。
  4. git log --oneline --left-right new_clone...new_branch,正如您已经做过的那样。
  5. 如果要将一个分支的更改和历史记录合并到另一个分支中,请使用合并。合并是一个非常强大的概念,但你应该已经熟悉了SVN的基本思想 - git往往更好地工作,因为它更好地考虑了即使在双向合并的修订版之间的共享祖先。 / LI>

答案 1 :(得分:0)

GIT与SVN不同 - 它是一个分布式版本控制系统。不要把它想象成具有服务器和多个客户端的SVN,而是以对等的方式来考虑它。

让我先回答你的问题:

  1. 转回:

    没有问题切换回new_clone - new_clone是一个存储库而不是分支,分支是master和new_branch,由git branch列出。如果您想切换到master(原始分支),请使用:git checkout master或一般git checkout <branch-name>

  2. 您可以使用git push origin new_branch将分支推送到原点。

  3. 如(1)所述,没有new_clone分支。使用此:git diff new_branch master

  4. 见(2)

  5. 在这种情况下,您不使用合并。但是,假设您有2个工作副本,并且您希望在它们之间共享代码,您可以使用git merge将更改从一个副本合并到另一个副本。

  6. 让我们看一下完整版,以帮助您理解所有概念。 Alice和Bob是2个使用GIT的用户(同行):

    创建2个用户Alice和Bob

    sudo adduser alice 
    sudo adduser bob 
    

    以Alice身份登录并配置

    su alice 
    git config --global user.name "Alice" 
    git config --global user.email alice@example.com 
    

    以Bob身份登录并配置

    su bob 
    git config --global user.name "Bob" 
    git config --global user.email bob@example.com
    

    Alice创建了一个GIT存储库

    mkdir project 
    cd project/ 
    git init 
    echo "Some text" > test 
    git add test 
    git commit -m "Adding test" 
    git status
    

    Bob克隆它,编辑并提交更改

    cd ~
    git clone /home/alice/project myclone 
    cd myclone/ 
    git log # See the changes from Alice
    echo "Some text - edited by Bob" > test 
    git commit -m "Making changes to test" -a 
    git diff 
    

    Alice合并来自bob的更改

    git remote add bob /home/bob/myclone 
    git fetch bob 
    git branch -a # To list
    git log -p master..bob/master 
    git merge --no-ff bob/master # Merge changes from Bob
    

    Alice在实验分支上进行更改,然后提交它:

    git branch experimental 
    git branch # To list
    git checkout experimental 
    git branch # To list
    echo "Some text - edited by Bob, further edited by Alice" > test 
    git commit -m "Further modifying test" -a 
    git checkout master 
    git log -p master..experimental 
    git merge --no-ff experimental 
    git branch -d experimental # To delete the branch
    
    鲍勃提出了改变:

    git pull
    

    请注意,此处没有中央服务器,Alice和Bob是同行。

    此处有更多详情: