Ваши аргументы против динамических языков совершенно допустимы. Однако рассмотрите следующее:
я также нашел его немного страшным для продвижения далеко от безопасного мира статического контроля типов сначала, но для меня преимущества безусловно перевешивают недостатки, и я никогда не оглядывался назад.
Еще один подход - добавить столбец «photo_count» в таблицу пользователей, обновить его с помощью триггеров, чтобы он отражал реальность, и добавить проверку, чтобы обеспечить максимальное количество фотографий.
Дополнительным преимуществом этого является то, что в любой момент мы знаем (не считая), сколько фотографий у пользователя.
С другой стороны, подход, предложенный Квассной, также довольно крутой, поскольку он дает вам возможность переупорядочить фотографии в случае, если пользователь хотел бы этого.
Это изменение было сделано специально, чтобы избежать путаницы, вызванной предыдущим поведением. Когда вы выполняете git pull
, FETCH_HEAD
обновляется, как указано выше, затем объединены с вашей извлеченной HEAD
, но ни одна из стандартных ветвей отслеживания для удаленного репозитория не будет обновлена (Git <1.8.4). Это означает, что локально он выглядит так, как будто вы опережаете удаленную ветку, тогда как на самом деле вы в курсе последних событий.
Лично я всегда делаю git fetch
, за которым следует git merge
, потому что я вижу все предупреждения о принудительных обновлениях перед слиянием, и я могу предварительно просмотреть то, что я сливаю. Если бы я использовал git pull
немного больше, чем я,
Что возвращает git remote -v show
, когда дело доходит до источника?
Если источник указывает на github, статус должен быть актуальным, а не впереди любого удаленного репо. По крайней мере, с Git1.6.5, который я использую для быстрого теста.
В любом случае, чтобы избежать этого, явно определите удаленное репо главной ветки:
$ git config branch.master.remote yourGitHubRepo.git
затем git pull origin master
, с последующим git status
должен возвращать чистый статус (не впереди).
Почему? поскольку мастер источника получения выборки (включенный в мастер источника извлечения git) не просто обновлял FETCH_HEAD
(как Чарльз Бейли объясняет в свой ответ ), но он также обновит "удаленную главную ветку" в вашем локальном репозитории Git.
В этом случае ваш локальный мастер больше не будет "опережать" удаленного мастера.
Я могу проверить это с помощью git1.6.5:
Сначала я создаю рабочий репозиторий:
PS D:\git\tests> cd pullahead
PS D:\git\tests\pullahead> git init workrepo
Initialized empty Git repository in D:/git/tests/pullahead/workrepo/.git/
PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo firstContent > afile.txt
PS D:\git\tests\pullahead\workrepo> git add -A
PS D:\git\tests\pullahead\workrepo> git commit -m "first commit"
Я моделирую Репозиторий GitHub путем создания чистого репо (которое может получать push из любого места)
PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github
Я добавляю модификатор в свое рабочее репо, которое я отправляю в репозиторий github (добавленный как удаленный)
PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo aModif >> afile.txt
PS D:\git\tests\pullahead\workrepo> git ci -a -m "a modif to send to github"
PS D:\git\tests\pullahead\workrepo> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo> git push github
Я создаю домашнее репо, клонированное GitHub, в котором я делаю пару изменений, помещенных в GitHub:
PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone github homerepo
PS D:\git\tests\pullahead> cd homerepo
PS D:\git\tests\pullahead\homerepo> type afile.txt
firstContent
aModif
PS D:\git\tests\pullahead\homerepo> echo aHomeModif1 >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a first home modif"
PS D:\git\tests\pullahead\homerepo> echo aHomeModif2 >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a second home modif"
PS D:\git\tests\pullahead\homerepo> git push github
Затем я клонирую workrepo для первого эксперимента
PS D:\git\tests\pullahead\workrepo4> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo2
Initialized empty Git repository in D:/git/tests/pullahead/workrepo2/.git/
PS D:\git\tests\pullahead> cd workrepo2
PS D:\git\tests\pullahead\workrepo2> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo2> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
* branch master -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
afile.txt | Bin 46 -> 98 bytes
1 files changed, 0 insertions(+), 0 deletions(-)
В этом репозитории git status упоминает master geing впереди ' origin
':
PS D:\git\tests\pullahead\workrepo5> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)
Но это только origin
не github:
PS D:\git\tests\pullahead\workrepo2> git remote -v show
github d:/git/tests/pullahead/github (fetch)
github d:/git/tests/pullahead/github (push)
origin D:/git/tests/pullahead/workrepo (fetch)
origin D:/git/tests/pullahead/workrepo (push)
Но если я повторю последовательность в репо, который имеет начало в github (или вообще не имеет происхождения, просто удаленный' github 'определено), статус чистый:
PS D:\git\tests\pullahead\workrepo2> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo4
PS D:\git\tests\pullahead> cd workrepo4
PS D:\git\tests\pullahead\workrepo4> git remote rm origin
PS D:\git\tests\pullahead\workrepo4> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo4> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
* branch master -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
afile.txt | Bin 46 -> 98 bytes
1 files changed, 0 insertions(+), 0 deletions(-)
PS D:\git\tests\pullahead\workrepo4> git status
# On branch master
nothing to commit (working directory clean)
Если бы у меня был только origin
, указывающий на github
, status
был бы чистым для git1.6.5.
Это может быть с предупреждением «впереди» для более раннего git, но в любом случае явно определенная git config branch.master.remote yourGitHubRepo.git
сможет позаботиться об этом, даже с ранними версиями Git .
Осторожно ли вы добавляете весь свой пульт (кроме origin
, который поставляется с вашим исходным клоном), используя git remote add NAME URL
? Я видел эту ошибку, когда они только что добавлялись в конфигурацию git.