bugfix> git > 投稿

最近、Gitlabで奇妙なことに出会いました。

ブランチ release/v1.3.0 からマージリクエストを作成しました master に受け入れられたブランチ。

Gitlabのいくつかの競合のため、Gitlab UIを介して直接マージすることはできません。Gitlabはローカルでマージすることを提案しました。

Step 1. Fetch and check out the branch for this merge request


git fetch origin
git checkout -b release/v1.3.0 origin/release/v1.3.0

  

ステップ2.ローカルで変更を確認する

  

ステップ3.ブランチをマージし、発生する競合を修正します

git fetch origin
git checkout origin/master
git merge --no-ff release/v1.3.0

  

ステップ4.マージの結果をGitLabにプッシュする

  

git push origin master

両方の枝( master および release/v1.3.0 )保護されています。

とにかく、私は指示に従いました:

C:\Users\eperret\Desktop
λ git clone [my-gitlab-repository-address] ResolveConflicts
Cloning into 'ResolveConflicts'...
Enter passphrase for key '/c/Users/eperret/.ssh/id_ed25519':
remote: Enumerating objects: 3303, done.
remote: Counting objects: 100% (3303/3303), done.
remote: Compressing objects: 100% (1193/1193), done.
Rremote: Total 3303 (delta 2023), reused 3234 (delta 1966)eceiving objects:  98% (3237/3303)
Receiving objects: 100% (3303/3303), 1.60 MiB | 5.80 MiB/s, done.
Resolving deltas: 100% (2023/2023), done.
C:\Users\eperret\Desktop
λ cd ResolveConflicts\
C:\Users\eperret\Desktop\ResolveConflicts (develop -> origin)
λ git fetch origin
Enter passphrase for key '/c/Users/eperret/.ssh/id_ed25519':
C:\Users\eperret\Desktop\ResolveConflicts (develop -> origin)
λ git checkout -b release/v1.3.0 origin/release/v1.3.0
Switched to a new branch 'release/v1.3.0'
Branch 'release/v1.3.0' set up to track remote branch 'release/v1.3.0' from 'origin'.
C:\Users\eperret\Desktop\ResolveConflicts (release/v1.3.0 -> origin)
λ git fetch origin
Enter passphrase for key '/c/Users/eperret/.ssh/id_ed25519':
Enter passphrase for key '/c/Users/eperret/.ssh/id_ed25519':
C:\Users\eperret\Desktop\ResolveConflicts (release/v1.3.0 -> origin)
λ git checkout origin/master
Note: checking out 'origin/master'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b <new-branch-name>
HEAD is now at 8311614 Merge branch 'release/v1.2.0' into 'master'
C:\Users\eperret\Desktop\ResolveConflicts (HEAD detached at 8311614 -> origin)
λ git merge --no-ff release/v1.3.0
[Auto merge failing details]
Automatic merge failed; fix conflicts and then commit the result.
# I resolved the conflicts in between
C:\Users\eperret\Desktop\ResolveConflicts (HEAD detached at 8311614 -> origin)
λ git commit -m "Resolve conflicts"
[detached HEAD 180a484] Resolve conflicts
C:\Users\eperret\Desktop\ResolveConflicts (HEAD detached at 180a484 -> origin)
λ git push origin master
error: src refspec master does not match any
error: failed to push some refs to [my-gitlab-repository-address]

そこで、参照について確認しました。

C:\Users\eperret\Desktop\ResolveConflicts (origin/master -> origin)
λ git show-ref
4996148e93ca64f3073047fb9a92ab16e03dbcd5 refs/heads/develop
4996148e93ca64f3073047fb9a92ab16e03dbcd5 refs/remotes/origin/HEAD
4996148e93ca64f3073047fb9a92ab16e03dbcd5 refs/remotes/origin/develop
8311614987d6df48d5d16d340c1b76a93b0600ba refs/remotes/origin/master
4996148e93ca64f3073047fb9a92ab16e03dbcd5 refs/remotes/origin/release/v1.3.0
8d2bd099e5de247ef38a3495d8601da9335272ff refs/tags/1.0.0
6e9deff7cdbc8cdcf56bf23dac02ff74a1ab2f22 refs/tags/1.0.1
447ca955fdbe83d5a3057ae43c120f2957a798f7 refs/tags/1.1.0
8cdd508715cb87104785a462090869041dcc2b72 refs/tags/1.1.1
8311614987d6df48d5d16d340c1b76a93b0600ba refs/tags/1.2.0

そして、もう少し具体的にしようとしました:

C:\Users\eperret\Desktop\ResolveConflicts (HEAD detached at 180a484-> origin)
λ git push origin HEAD:master
Enter passphrase for key '/c/Users/eperret/.ssh/id_ed25519':
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 225 bytes | 225.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
remote: GitLab: You are not allowed to push code to protected branches on this project.
To [my-gitlab-repository-address]
 ! [remote rejected] HEAD -> master (pre-receive hook declined)
error: failed to push some refs to '[my-gitlab-repository-address]'

基本的に最初からGitlabの指示(ターゲットブランチが保護されていることを最初から知っている)が、そうでないことを実行するように指示します。

とにかく、その状況でMRをマージする方法についてのアイデアはありますか(投稿の競合のコミットはローカルのみであることを知っている)?


[編集]

gitlabの競合解決機能に関するいくつかの問題を発見しました。

  • https://gitlab.com/gitlab-org/gitlab-ce/issues/59048
  • https://gitlab.com/gitlab-org/gitlab-ce/issues/60101

特に後者では:

If I don't have push permissions to the target branch, I won't be able to merge the change locally and push. It's confusing that the instructions are shown as if that is an option.

回答 2 件
  • git checkout origin/master を実行したときに問題が発生しました 。実際の master に切り替えるのではなく、切り離されたHEAD状態になりました  ブランチ。

    私はあなたがちょうど git checkout master を使用できるはずだと思います 。また、 git pull origin master が必要になる場合があります  その後、ローカルマスターブランチを更新します。

    これを行うことにより、分離されたHEAD状態にならないことを願っています。その後、マスターにプッシュバックすると正常に動作するはずです- git push origin master

    要約すると、GitLabの手順のステップ3では、代わりに次のことを試してください。

    git checkout master

    git pull origin master

    git merge --no-ff release/v1.3.0

    次に、ステップ4の場合:

    git push origin master

  • 問題の中心は、ターゲット(マスター)ブランチが保護されているため、ローカルリポジトリからのプッシュが機能しないことです。

    編集した投稿で述べたように:https://gitlab.com/gitlab-org/gitlab-ce/issues/60101

    If I don't have push permissions to the target branch, I won't be able to merge the change locally and push. It's confusing that the instructions are shown as if that is an option.

    したがって、プッシュはローカルで実行できないため、基本的にマージはUIからのみ実行できます(つまり、ターゲットブランチは再び保護されます)。

    マージ要求は、ローカルの競合解決を必要とする競合がない場合、承認時にマージできます。

    解決策は、 master から新しいブランチを作成することでした   develop と既にマージされた(別名、すでに競合が解決されている)ローカルブランチ  実際のブランチを作成する前のブランチ( release/vX.Y.Z ) 氏に。

    git clone [my-gitlab-repository-address] ResolveConflicts (if needed)
    git checkout master
    git pull origin master
    git merge --no-ff develop
    git commit -m "Resolve conflicts" (if needed)
    git branch release/vX.Y.Z
    git checkout release/vX.Y.Z
    git push --set-upstream origin release/vX.Y.Z
    
    

    最後に、Gitlabで release/vX.Y.Z からMRを作成します   master へ 、承認されたら、UIからマージします。

あなたの答え