最近、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.
問題の中心は、ターゲット(マスター)ブランチが保護されているため、ローカルリポジトリからのプッシュが機能しないことです。
編集した投稿で述べたように: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からマージします。
- マスターブランチから機能ブランチにコミットを自動的にマージするgitオプションはありますか?
- リポジトリの一部を自分のリポジトリにマージする
- コンピューターで複数のgithubアカウントを構成する方法は?
- Intellijは、indexlockが存在しないときに存在すると主張しています
- git local envをセットアップします
- git fake merge(コミットを実際のマージなしでマージ済みとしてマークする)
- git rebase interactive、バイナリファイルをマージできません、エラー:適用できませんでした
- マージ後のGitマージ
- 現在のブランチとは異なるブランチを作成できますか?
- 新しいファイル、gitはマージを要求します、なぜですか?
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