2017-01-03 3 views
0

Я изучаю Git. Я создал 3 папки e:\temp\repo remote, e:\temp\repo local 1 и e:\temp\repo local 2. Я хочу сделать следующие вещи:Выдвижение двух модифицированных и совершенных клонов GIT

В папке e:\temp\repo remote:

git init --bash 

В папке e:\temp\repo local 1:

git clone "e:\temp\repo remote" "e:\temp\repo local 1" 

В папке e:\temp\repo local 2:

git clone "e:\temp\repo remote" "e:\temp\repo local 2" 

Скопируйте файл file1.txt в e:\temp\repo local 1\dir1. Скопируйте файл file2.txt в папку e:\temp\repo local 2\dir2.

В папке e:\temp\repo local 1

git add * 
git commit -m "dir1\file1.txt created" 
git push 

В папке e:\temp\repo local 2

git add * 
git commit -m "dir2\file2.txt created" 

Когда я хочу, чтобы подтолкнуть местное 2 репо в удалённой, он выдает следующее сообщение:

To E:\temp\repo remote 
! [rejected]  master -> master (fetch first) 
error: failed to push some refs to 'E:\temp\repo remote' 
hint: Updates were rejected because the remote contains work that you do 
hint: not have locally. This is usually caused by another repository pushing 
hint: to the same ref. You may want to first integrate the remote changes 
hint: (e.g., 'git pull ...') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details." 

Я следую инструкциям и вызываю pull in local 2 :

$ git pull 
warning: no common commits 
remote: Counting objects: 4, done. 
remote: Total 4 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (4/4), done. 
From E:\temp\repo remote 
* [new branch]  master  -> origin/master 
fatal: refusing to merge unrelated histories 

Или

$ git pull "e:\temp\repo remote" 
From e:\temp\repo remote 
* branch   HEAD  -> FETCH_HEAD 
fatal: refusing to merge unrelated histories 

Но почему там не связанные между собой истории?

Как объединить изменения второго пользователя в удаленном репо?

ответ

3

Они не связаны между собой, поскольку в исходном хранилище никогда не было истории. git init --bare создает пустой (пустой) репозиторий без какой-либо истории. Нет ни одной фиксации, ни одной ветки.

Если вы клонируете этот пустой репозиторий, вы получаете еще один пустой репозиторий, снова без фиксации и без ветки. Таким образом, делая это дважды, вы получаете два пустых хранилища, которые не используют ничего, кроме своего удаленного.

Затем, после того, как вы совершили что-то в этих локальных хранилищах, вы создаете первый «root commit». Этот корневой фиксатор затем устанавливается как отправная точка для этого репозитория.

Поскольку вы делаете это в обоих хранилищах, вы получаете две разные корневые фиксации. Они несовместимы друг с другом, поскольку они не имеют никакой истории (они оба являются корнем их соответствующего репозитория).

Чтобы избежать этого, ваш репозиторий должен начинаться с корневого коммита. Поэтому перед тем, как создавать эти клоны, просто нажмите ветку с по крайней мере одной фиксацией в репозиторий. Затем взаимодействие с использованием pull будет работать должным образом, так как Git выяснит, что они имеют некоторую историю (по крайней мере, фиксацию root).

+0

Является ли «хозяин» не веткой? –

+0

Да, но пока вы не создадите первую фиксацию, даже эта ветвь на самом деле не существует. Git находится в промежуточном состоянии до тех пор, пока вы не создадите первый фиксатор. – poke

+0

Тогда какие команды следует отправлять перед клонированными? (в удаленном репозитории) –

Смежные вопросы