Переименуйте ветвь GitHub и сохраните фиксацию History [duplicate]

Если вы не используете jQuery в своем коде, этот ответ для вас

Ваш код должен быть чем-то вроде этого:

function foo() {
    var httpRequest = new XMLHttpRequest();
    httpRequest.open('GET', "/echo/json");
    httpRequest.send();
    return httpRequest.responseText;
}

var result = foo(); // always ends up being 'undefined'

Феликс Клинг отлично справился с написанием ответа для людей, использующих jQuery для AJAX, я решил предоставить альтернативу для людей, которые этого не делают.

( Примечание. используя новый API fetch, угловые или обещания, я добавил еще один ответ ниже )


То, с чем вы столкнулись

Это краткое резюме «Объяснение проблемы» из другого ответа, если вы не уверены, прочитав это, прочитайте это.

A в AJAX означает асинхронность. Это означает, что отправка запроса (или, скорее, получение ответа) вынимается из обычного потока выполнения. В вашем примере .send немедленно возвращается, а следующий оператор return result; выполняется до того, как функция, которую вы передали, когда был вызван обратный вызов success.

Это означает когда вы возвращаетесь, слушатель, который вы определили, еще не выполнил, что означает, что возвращаемое вами значение не было определено.

Вот простая аналогия

function getFive(){ 
    var a;
    setTimeout(function(){
         a=5;
    },10);
    return a;
}

(Fiddle)

Возвращаемое значение a - undefined так как часть a=5 еще не выполнена. AJAX действует так, вы возвращаете значение до того, как сервер получил возможность сообщить вашему браузеру, что это за значение.

Одним из возможных решений этой проблемы является код повторно активно , сообщая вашей программе, что делать, когда расчет завершен.

function onComplete(a){ // When the code completes, do this
    alert(a);
}

function getFive(whenDone){ 
    var a;
    setTimeout(function(){
         a=5;
         whenDone(a);
    },10);
}

Это называется CPS . В основном, мы передаем getFive действие, которое необходимо выполнить, когда оно завершается, мы сообщаем нашему кодексу, как реагировать, когда событие завершается (например, наш вызов AJAX или в этом случае время ожидания).

Использование будет:

getFive(onComplete);

Который должен предупредить «5» на экране. (Fiddle) .

Возможные решения

Существуют два способа решения этой проблемы:

  1. Сделать AJAX синхронный вызов (позволяет называть его SJAX).
  2. Реструктурируйте свой код для правильной работы с обратными вызовами.

1. Синхронный AJAX - Не делайте этого !!

Что касается синхронного AJAX, не делайте этого! Ответ Феликса вызывает некоторые веские аргументы в пользу того, почему это плохая идея. Подводя итог, он заморозит браузер пользователя, пока сервер не вернет ответ и не создаст очень плохой пользовательский интерфейс. Вот еще краткое резюме из MDN о том, почему:

XMLHttpRequest поддерживает как синхронную, так и асинхронную связь. В общем, однако, асинхронные запросы должны быть предпочтительнее синхронных запросов по причинам производительности.

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

Если вы имеете , вы можете передать флаг: Вот как это сделать:

var request = new XMLHttpRequest();
request.open('GET', 'yourURL', false);  // `false` makes the request synchronous
request.send(null);

if (request.status === 200) {// That's HTTP for 'ok'
  console.log(request.responseText);
}

2. Код реструктуризации

Пусть ваша функция принимает обратный вызов. В примере код foo может быть сделан для принятия обратного вызова. Мы сообщим нашему кодексу, как отреагировали , когда foo завершает работу.

Итак:

var result = foo();
// code that depends on `result` goes here

Становится:

foo(function(result) {
    // code that depends on `result`
});

Здесь мы передали анонимную функцию, но мы могли бы так же легко передать ссылку на существующую , чтобы он выглядел следующим образом:

function myHandler(result) {
    // code that depends on `result`
}
foo(myHandler);

Для получения дополнительной информации о том, как выполняется этот вид обратного вызова, проверьте ответ Felix.

Теперь давайте определим сам foo, чтобы действовать соответственно

function foo(callback) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onload = function(){ // when the request is loaded
       callback(httpRequest.responseText);// we're calling our method
    };
    httpRequest.open('GET', "/echo/json");
    httpRequest.send();
}

(скрипка)

Теперь мы сделали нашу функцию foo принять действие, которое будет выполняться, когда AJAX завершится успешно, мы можем продолжить это, проверив, не является ли статус ответа не 200 и действует соответственно (создайте обработчик сбоя и т. д.). Эффективное решение нашей проблемы.

Если вам все еще трудно понять это , прочитайте руководство по началу работы AJAX в MDN.

141
задан JayD 2 June 2015 в 07:41
поделиться

4 ответа

Вы не можете напрямую переименовать удаленную ветку. Вы должны удалить его, а затем повторно нажать.

Переименование ветки

# rename the local branch to the new name
git branch -m <old_name> <new_name> 

# delete the old branch on remote - where <remote> is eg. origin
git push <remote> --delete old_name

# push the new branch to remote         
git push <remote> new_name


Важное примечание:

Когда вы используете git branch -m (move), git также обновляет вашу ветку отслеживания с новым именем.

git remote rename regacy legacy

git remote rename пытается обновите удаленный раздел в файле конфигурации. Он переименует пульт с заданным именем на новое имя, но в вашем случае он не обнаружен, поэтому переименование не удалось.

Но он не будет делать то, что вы думаете, он переименует ваше локальное имя удаленной конфигурации, а не удаленную ветвь. & nbsp;


Примечание. Серверы Git могут позволить вам переименовать git, используя веб-интерфейс или внешние программы (например, Sourctree и т. д.), но вы должны иметь в виду, что в git вся работа выполняется локально, поэтому рекомендуется использовать приведенные выше команды для работы.

299
ответ дан CodeWizard 25 August 2018 в 09:19
поделиться

Если вы неправильно указали ветку и перетащили ее в удаленный репозиторий, выполните следующие шаги, чтобы переименовать эту ветку ( на основе этой статьи ):

  1. Переименуйте свой local branch: Если вы находитесь в ветке, которую хотите переименовать: git branch -m new-name Если вы находитесь на другом ветке: git branch -m old-name new-name
  2. Удалите удаленную ветвь old-name и нажмите локальную ветвь new-name : git push origin :old-name new-name
  3. Сбросьте ветвь восходящего потока для локальной ветви нового имени: перейдите к ветке, а затем: git push origin -u new-name
35
ответ дан Dr1Ku 25 August 2018 в 09:19
поделиться

Нет прямого метода,

  1. Переименовать локальную ветвь, моя текущая ветка - master git branch -m master_renamed #master_renamed - новое имя мастера
  2. Удалить удаленный филиал, git push origin --delete master_renamed #origin is remote_name
  3. Нажмите переименованную ветвь на пульте дистанционного управления, git push origin master_renamed

thats it ...

1
ответ дан Mohideen ibn Mohammed 25 August 2018 в 09:19
поделиться

Кажется, что существует прямой способ:

Если вы действительно хотите просто переименовать филиалы удаленно (без переименования каких-либо локальных ветвей одновременно), вы можете сделать это с помощью одной команды например

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

https://stackoverflow.com/a/21302474/2586761

См. оригинальный ответ для более подробной информации

18
ответ дан ptim 25 August 2018 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: