Gitlabのrootユーザー(admin)のパスワードを忘れてしまった場合

この記事は最終更新日から1年以上が経過しています。

Gitlabのrootユーザー(admin)のパスワードを忘れてしまった場合

GitlabCEのrootユーザー(admin)のパスワードを忘れてしまったため、
コンソールから強制的にパスワードリセットを実施した時のメモです。

環境

  • CentOS67
  • GitLab 7.14.1 481c966 Check

手順

Gitlabをインストールしたアカウントかサーバのrootアカウントで
サーバへsshログインして以下コマンドを実行します。

  1. gitlab-rails console production # コンソール起動(少しが時間かかります。)
  2. user = User.where(id: 1).first # rootアカウント設定モードへ
  3. user.password = 'secret_pass' # 新パスワード設定
  4. user.password_confirmation = 'secret_pass' # 新パスワード設定(確認)
  5. user.save! # 設定の保存
  6. exit # コンソールを抜ける

実行結果

[root@gitlab_server ~]# gitlab-rails console production
Loading production environment (Rails 4.1.11)
irb(main):001:0> user = User.where(id: 1).first
=> #<User id: 1, email: "admin@example.com", 
中略
public_email: "", dashboard: 0, project_view: 0>
irb(main):002:0> user.password = 'password'
=> "password"
irb(main):003:0> user.password_confirmation = 'password'
=> "password"
irb(main):004:0> user.save!
=> true
irb(main):005:0> exit
[root@gitlab_server ~]# 

参考

How to reset your root password


https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Stashing%EA%B3%BC-Cleaning


Git 도구 - Stashing과 Cleaning

Stashing과 Cleaning

당신이 어떤 프로젝트에서 한 부분을 담당하고 있다고 하자. 그리고 여기에서 뭔가 작업하던 일이 있고 다른 요청이 들어와서 잠시 브랜치를 변경해야 할 일이 생겼다고 치자. 그런데 이런 상황에서 아직 완료하지 않은 일을 커밋하는 것이 껄끄럽다는 것이 문제다. 커밋하지 않고 나중에 다시 돌아와서 작업을 다시 하고 싶을 것이다. 이 문제는 git stash 라는 명령으로 해결할 수 있다.

Stash 명령을 사용하면 워킹 디렉토리에서 수정한 파일들만 저장한다. Stash는 Modified이면서 Tracked 상태인 파일과 Staging Area에 있는 파일들을 보관해두는 장소다. 아직 끝내지 않은 수정사항을 스택에 잠시 저장했다가 나중에 다시 적용할 수 있다(브랜치가 달라져도 말이다).

Note
git stash push 로의 이동

2017년 10월 말 Git 메일링 리스트에는 엄청난 논의가 있었습니다. 논의는 git stash save 명령을 은퇴시키고 git stash push`로 대체하는 내용에 대한 것이었습니다. `git stash push 명령의 경우 pathspec 으로 선택하여 Stash하는 옵션이 추가되었는데 git stash save 명령이 지원하지 못하는 것이었습니다.

git stash save 명령이 곧바로 삭제되는 것은 아니기에 아직 이 명령을 쓰는 것에 대해 걱정할 필요는 없지만 git stash push 명령으로 대체하는 것에 대해 생각해볼 필요가 있습니다.

하던 일을 Stash 하기

예제 프로젝트를 하나 살펴보자. 파일을 두 개 수정하고 그 중 하나는 Staging Area에 추가한다. 그리고 git status 명령을 실행하면 아래와 같은 결과를 볼 수 있다.

$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

  modified:   index.html

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

  modified:   lib/simplegit.rb

이제 브랜치를 변경해 보자. 아직 작업 중인 파일은 커밋할 게 아니라서 모두 Stash 한다. git stash 나 git stash save 를 실행하면 스택에 새로운 Stash가 만들어진다.

$ git stash
Saved working directory and index state \
  "WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")

대신 워킹 디렉토리는 깨끗해졌다.

$ git status
# On branch master
nothing to commit, working directory clean

이제 아무 브랜치나 골라서 쉽게 바꿀 수 있다. 수정하던 것을 스택에 저장했다. 아래와 같이 git stash list 를 사용하여 저장한 Stash를 확인한다.

$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

Stash 두 개는 원래 있었다. 그래서 현재 총 세 개의 Stash를 사용할 수 있다. 이제 git stash apply 를 사용하여 Stash를 다시 적용할 수 있다. git stash 명령을 실행하면 Stash를 다시 적용하는 방법도 알려줘서 편리하다. `git stash apply stash@{2}`처럼 Stash 이름을 입력하면 골라서 적용할 수 있다. 이름이 없으면 Git은 가장 최근의 Stash를 적용한다.

$ git stash apply
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

  modified:   index.html
  modified:   lib/simplegit.rb

no changes added to commit (use "git add" and/or "git commit -a")

Git은 Stash에 저장할 때 수정했던 파일들을 복원해준다. 복원할 때의 워킹 디렉토리는 Stash 할 때의 그 브랜치이고 워킹 디렉토리도 깨끗한 상태였다. 하지만 꼭 깨끗한 워킹 디렉토리나 Stash 할 때와 같은 브랜치에 적용해야 하는 것은 아니다. 어떤 브랜치에서 Stash 하고 다른 브랜치로 옮기고서 거기에 Stash를 복원할 수 있다. 그리고 꼭 워킹 디렉토리가 깨끗한 상태일 필요도 없다. 워킹 디렉토리에 수정하고 커밋하지 않은 파일들이 있을 때도 Stash를 적용할 수 있다. 만약 충돌이 있으면 알려준다.

Git은 Stash를 적용할 때 Staged 상태였던 파일을 자동으로 다시 Staged 상태로 만들어 주지 않는다. 그래서 git stash apply 명령을 실행할 때 --index 옵션을 주어 Staged 상태까지 적용한다. 그래야 원래 작업하던 상태로 돌아올 수 있다.

$ git stash apply --index
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

  modified:   index.html

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

  modified:   lib/simplegit.rb

apply 옵션은 단순히 Stash를 적용하는 것뿐이다. Stash는 여전히 스택에 남아 있다. git stash drop명령을 사용하여 해당 Stash를 제거한다.

$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)

그리고 git stash pop 이라는 명령도 있는데 이 명령은 Stash를 적용하고 나서 바로 스택에서 제거해준다.

Stash를 만드는 새로운 방법

Stash를 만드는 방법은 여러 가지다. 주로 사용하는 옵션으로 stash save 명령과 같이 쓰는 --keep-index 이다. 이 옵션을 이용하면 이미 Staging Area에 들어 있는 파일을 Stash 하지 않는다.

$ git status -s
M  index.html
 M lib/simplegit.rb

$ git stash --keep-index
Saved working directory and index state WIP on master: 1b65b17 added the index file
HEAD is now at 1b65b17 added the index file

$ git status -s
M  index.html

추적하지 않는 파일과 추적 중인 파일을 같이 Stash 하는 일도 꽤 빈번하다. 기본적으로 git stash 는 추적 중인 파일만 저장한다. 추적 중이지 않은 파일을 같이 저장하려면 Stash 명령을 사용할 때 --include-untracked 나 -u 옵션을 붙여준다.

$ git status -s
M  index.html
 M lib/simplegit.rb
?? new-file.txt

$ git stash -u
Saved working directory and index state WIP on master: 1b65b17 added the index file
HEAD is now at 1b65b17 added the index file

$ git status -s
$

끝으로 --patch 옵션을 붙이면 Git은 수정된 모든 사항을 저장하지 않는다. 대신 대화형 프롬프트가 뜨며 변경된 데이터 중 저장할 것과 저장하지 않을 것을 지정할 수 있다.

$ git stash --patch
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index 66d332e..8bb5674 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -16,6 +16,10 @@ class SimpleGit
         return `#{git_cmd} 2>&1`.chomp
       end
     end
+
+    def show(treeish = 'master')
+      command("git show #{treeish}")
+    end

 end
 test
Stash this hunk [y,n,q,a,d,/,e,?]? y

Saved working directory and index state WIP on master: 1b65b17 added the index file

Stash를 적용한 브랜치 만들기

보통 Stash에 저장하면 한동안 그대로 유지한 채로 그 브랜치에서 계속 새로운 일을 한다. 그러면 이제 저장한 Stash를 적용하는 것이 문제가 된다. 수정한 파일에 Stash를 적용하면 충돌이 일어날 수도 있고 그러면 또 충돌을 해결해야 한다. 필요한 것은 Stash 한 것을 쉽게 다시 테스트하는 것이다. git stash branch <브랜치> 명령을 실행하면 Stash 할 당시의 커밋을 Checkout 한 후 새로운 브랜치를 만들고 여기에 적용한다. 이 모든 것이 성공하면 Stash를 삭제한다.

$ git stash branch testchanges
M index.html
M lib/simplegit.rb
Switched to a new branch 'testchanges'
On branch testchanges
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

  modified:   index.html

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

  modified:   lib/simplegit.rb

Dropped refs/stash@{0} (29d385a81d163dfd45a452a2ce816487a6b8b014)

이 명령은 브랜치를 새로 만들고 Stash를 복원해주는 매우 편리한 도구다.

워킹 디렉토리 청소하기

작업하고 있던 파일을 Stash 하지 않고 단순히 그 파일들을 치워버리고 싶을 때가 있다. git clean 명령이 그 일을 한다.

보통은 Merge나 외부 도구가 만들어낸 파일을 지우거나 이전 빌드 작업으로 생성된 각종 파일을 지우는 데 필요하다.

이 명령을 사용할 때는 신중해야 한다. 이 명령을 사용하면 워킹 디렉토리 안의 추적하고 있지 않은 모든 파일이 지워지기 때문이다. 명령을 실행하고 나서 후회해도 소용없다. 지워진 파일은 돌아오지 않는다.git stash –all 명령을 이용하면 지우는 건 똑같지만, 먼저 모든 파일을 Stash 하므로 좀 더 안전하다.

워킹 디렉토리의 불필요한 파일들을 전부 지우려면 git clean 을 사용한다. 추적 중이지 않은 모든 정보를 워킹 디렉토리에서 지우고 싶다면 git clean -f -d 명령을 사용하자. 이 명령은 하위 디렉토리까지 모두 지워버린다. -f 옵션은 강제(force)의 의미이며 "진짜로 그냥 해라"라는 뜻이다.

이 명령을 실행했을 때 어떤 일이 일어날지 미리 보고 싶다면 -n 옵션을 사용한다. -n 옵션은 “가상으로 실행해보고 어떤 파일들이 지워질지 알려달라” 라는 뜻이다.

$ git clean -d -n
Would remove test.o
Would remove tmp/

git clean 명령은 추적 중이지 않은 파일만 지우는 게 기본 동작이다. .gitignore 에 명시했거나 해서 무시되는 파일은 지우지 않는다. 무시된 파일까지 함께 지우려면 -x 옵션이 필요하다. 그래서 .o 파일 같은 빌드 파일까지도 지울 수 있다.

$ git status -s
 M lib/simplegit.rb
?? build.TMP
?? tmp/

$ git clean -n -d
Would remove build.TMP
Would remove tmp/

$ git clean -n -d -x
Would remove build.TMP
Would remove test.o
Would remove tmp/

git clean 이 무슨 짓을 할지 확신이 안들 때는 항상 -n 옵션을 붙여서 먼저 실행해보자. clean 명령을 대화형으로 실행하려면 -i 옵션을 붙이면 된다.

대화형으로 실행한 clean 명령의 모습은 아래와 같다.

$ git clean -x -i
Would remove the following items:
  build.TMP  test.o
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each             5: quit
    6: help
What now>

대화형으로 실행하면 파일마다 지우지 말지 결정하거나 특정 패턴으로 걸러서 지울 수도 있다.


gitでリモートブランチをローカルにcheckoutする

この記事は最終更新日から3年以上が経過しています。

新しい作業環境で開発リポジトリのmasterリポジトリをcloneしたあとにその他のブランチもcheckout/pullしたいことがある。というか、しないと作業にならない。

よく忘れるのでメモ。

git checkout -b local_branch_name origin/remote_branch_name

remote_branch_nameリモートブランチから派生するlocal_branch_nameローカルブランチを新たに作成する。

-bオプションをつけることで「新しいブランチを作り、チェックアウトする」という動作になる。


[初心者向け]こんなときどうする⁉︎ GitのTips31選!(https://qiita.com/Keisuke69/items/35d60e4e375fc525ccbd)

はじめに

半分自分用のメモですが、Gitを使って開発してる場合によくあることを簡単にまとめました。
よくあるネタではあるのですが、自分が困ったときに調べた結果をまとめています。
特に使い始めの頃とか初心者の人が困ったときの手助けになれば。
なお、自己責任でお願いします。
※この記事は元々自分のブログに投稿していたものを少し手直しして転載したものです
※間違いあったら指摘してください
※数が増えてたのにタイトルが26のままだったので修正しました

変更確認系

変更箇所を直前のコミットタイミングと比較したい

git diff HEAD~1

差分のサマリを見たい

git diff --stat <source> <target>

スペースの変更を無視してdiffしたい

これをしないと全体をインデントしたときとかに悲惨です。

git diff --ignore-space-change <source> <target>

自分のリポジトリをフォークして作られた他人のリポジトリを比較

git remote add <name> <フォーク元もしくは比較したいリポジトリ>
git fetch <name> #先ほど追加したリモートをfetch 
git diff FETCH_HEAD

フォーク元との比較にもどうぞ。

あれこれ修正したい

直前のコミットメッセージを変更したい

git commit --amend -m "new comment"

コミットをまとめたい

git rebase -i HEAD~5

エディタが開くのでpickなりrewordなりfixupなりを行う。
上記はHEADから5個前までのコミットを対象に作業している。

直前以前のコミットメッセージを変更したい

「コミットをまとめたい」とやり方は同じ。変更したい箇所までのHEADを指定してrebaseを実行する。
あとは変更したい箇所でpickなりをする。

コミッタ名やメールアドレスを変更したい

通常は以下の2コマンドで名前とメールアドレスを設定しておけば問題ない。

git config --global user.name "Your Name"
git config --global user.email you@example.com

が、既に異なる名前でコミットされているものを後から変更したい場合は以下のような処理を実行すればよい

git filter-branch --commit-filter '
    GIT_AUTHOR_NAME="New Name"
    GIT_AUTHOR_EMAIL="new@example.com"
    GIT_COMMITTER_NAME="New Name"
    GIT_COMMITTER_EMAIL="new@example.com"
    git commit-tree "$@"
' HEAD

commit-filterの後にシェルスクリプトを記述する。
上記の場合は、全てのコミットログに対して名前とアドレスを変更する処理を行っているが特定のコミッタだけ変更したい場合などはシェルのif文なりで引っ掛ければよい

取り消し系

githubにpushしたcommitの取り消し

githubにpushして後にcommitが間違っていたことに気づいた場合など。
ただし、以下の手順を実施するとcommitだけでなく変更も失われるので注意。ローカルのソースツリーは残された最後のcommitに戻されます。変更を保存したい場合は使わないように。

git rebase -i HEAD~2 #エディタが開くので二行目を削除して保存する
git push origin +master

github側だけcommitの取り消し

commitの取り消しをgithub側だけで行う場合。ローカルは同期されない。

git push -f origin HEAD^:master

ローカルだけcommitの取り消し

git reset HEAD^

git addの取り消し

git rm --cached <取り消したいファイル>

いろいろやり直したい(間違ってreset --hardした時とか)

git reflog

でHEADの変遷を表示して戻したい位置を指定してresetする。ちなみにHEAD@[0}が現在のHEAD位置。

git reset --hard HEAD@{1}

みたいな感じで。

間違って削除したファイルを元に戻したい

git checkout -f <対象ファイル>

ただし、変更も戻る。

ファイルを指定しない場合は全体が戻ります。

その他いろいろ

他人のリポジトリをローカルの別ブランチにチェックアウトしたい

git remote add <name> <フォーク元もしくは比較したいリポジトリ>
git fetch <name>
git checkout -b <branch_name> remotes/<remote_name>/<remote_branch_name>

github上でforkしたリポジトリの最新化

forkしたリポジトリをcloneした上でfork元のリポジトリをpullするだけ。
pullするにあたってはfork元をremoteに追加しておいてもいいし直接URL指定でもいい。

指定のタグをチェックアウトしてブランチ作成

git checkout -b <ブランチ名> refs/tags/<タグ名>
#ブランチ作らないなら-b不要

タグとタグの間のコミットログを表示

git log v1.0..v1.1 --pretty=format:"%ci [%h]%s"
#タグの代わりにハッシュ値を指定することもできる

タグの一覧表示

git tag -l

タグがリンクしているコミットのハッシュ値を確認

git rev-parse <タグ名>

特定のハッシュ値のコミットログを確認

git log ハッシュ値

リモートリポジトリのタグを削除

まずローカルでタグを削除してリモートを空のタグで上書きする

git tag -d <タグ名>
git push origin :refs/tags/<タグ名>

特定ファイルのブランチによる違いの比較

git diff branch1 branch2 filepath

リモートブランチをトラッキング先に設定

git branch --set-upstream work remotes/origin/work 

リモートブランチを削除したい

git push [remotename] :[branch] 

強制的にpushする

リモート側のツリーを強制的に上書きしてローカルの内容でpushしたい場合

git push <リモート名> <ローカルブランチ> --force

特定のコミットだけをマージしたい

git log等で対象コミットのハッシュ値を確認した上でcherry-pickを実行する。

git cherry-pick <ハッシュ値>

gitignoreで指定する前にaddしてしまった場合

インデックスから削除すると同時にファイルも削除する場合

$ git rm -f hogehoge~

インデックスからだけ削除する場合
※つまりファイルはそのまま

$ git rm --cached -f hogehoge~

gitの設定を確認したい

git config --list

ユーザ名とメールアドレスを設定したい

システム上の特定ユーザすべてのリポジトリで設定するには--globalオプションを指定する。

$ git config --global user.name "foo bar"
$ git config --global user.email foo@example.com

普通にrmしたファイルをまとめてgit rmしたい

OS上でrmで削除してしまったものをgit上でも削除したいがうっかりフォルダごと、しかも複数消してしまって大量にある場合など

$ git rm $(git ls-files --deleted)

最後に

今後も自分で躓いたりして新しいネタ見つけたら更新していきます。



1. rebase의 동작원리


・feature브랜치가 처음 파생된 아래 표시된 빨간점이 feature 브랜치의 base라고한다. rebase란 저 베이스를 옮기는 것을 의미한다.




base 이후부터 feature 가 만든 커밑까지의 플로우가  임시저장소에 격납. 격납된 부분을 fetch라고 부름





base 이후부터 feature 가 만든 커밑까지의 플로우가 삭제되고 feature는 master의 최신 커밑으로 checkout됨







・임시저장소의 fetch에서 커밑 하나하나를 master브랜치로 옮겨 master의 최신 커밑과 병합을 시킴





 





2. rebase 실행해보기


[지금까지의 플로우]

master 브랜치에서 1을 커밑

rb브랜치 생성

rb 브랜치에서 R1을 커밑

rb 브랜치에서 R2를 커밑

master 브렌치로 체크아웃

master 브렌치에서 M1을 커밑

master 브렌치에서 M2를 커밑

・$ git log --decorate --all --oneline --graph

rb의 base는 1인데, rebase해서 rb의 base를 M2로 바꾸어 줄 것임

* 1a65c2a (HEAD -> master) M2

* 338f6a1 M1

| * 8a1ca73 (rb) R2

| * a283221 R1

|/

* 8c33afd 1

git rebase master

git rebase master : branch가 rb에 존재할 때, rb의 베이스를 변경

git merge rb : branch가 master 에 존재할 때, rb를 master로 병합시킴


$ git log --decorate --all --oneline --graph


* f9c53a8 (HEAD -> rb) R2

* b0d3c67 R1

* 1a65c2a (master) M2

* 338f6a1 M1

* 8c33afd 1

git checkout master

git merge rb 

master 브랜치는 rb이상 가지고 있는 커밑이 없으므로 fast-forwarding


$ git log --decorate --all --oneline --graph

* f9c53a8 (HEAD -> master, rb) R2

* b0d3c67 R1

* 1a65c2a M2

* 338f6a1 M1

* 8c33afd 1


3. rebase의 충돌


[지금까지의 플로우]

master 브랜치에서 1을 커밑(f1.txt파일의 첫번째 줄에 A작성)

master 브렌치에서 M1을 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 M1작성)

rb브랜치 생성

rb 브랜치에서 R1을 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 R1작성)

rb 브랜치에서 R2를 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 R2작성)

rb 브랜치에서 R2를 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 R3작성)


$ git log --decorate --oneline --graph --all

* f5dc64d (HEAD -> rb) R3

* 20fd541 R2

* 6f0c444 R1

| * 4e9dd84 (master) M1

|/

* 3b42f60 1

git rebase master

-2번째 줄의 내용이 모두 상이하므로 rebase시 충돌 발생

First, rewinding head to replay your work on top of it...

Applying: R1

error: Failed to merge in the changes.

Using index info to reconstruct a base tree...

M       f1.txt

Falling back to patching base and 3-way merge...

Auto-merging f1.txt

CONFLICT (content): Merge conflict in f1.txt

Patch failed at 0001 R1

The copy of the patch that failed is found in: .git/rebase-apply/patch


Resolve all conflicts manually, mark them as resolved with

"git add/rm <conflicted_files>", then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".

To abort and get back to the state before "git rebase", run "git rebase --abort".

충돌을 수동으로 해결 후 git rebase --continue 하라는 메시지가 뜸 
rebase in progress; onto 4e9dd84
You are currently rebasing branch 'rb' on '4e9dd84'.
  (all conflicts fixed: run "git rebase --continue")

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   f1.txt
・이때의 log를 확인해보니..

-git log --decorate --oneline --graph --all로 현재상황 확인

* 43a38df (HEAD) R1

* 4e9dd84 (master) M1

| * f5dc64d (rb) R3

| * 20fd541 R2

| * 6f0c444 R1

|/

* 3b42f60 1

-R1이 새로운 베이스 M1뒤에 잘 붙어있음.



git rebase --continue 

-R1의 둘째줄과 R2의 둘째줄이 겹치기 때문에 또 오류 메시지 뜸

-수동으로 수정 후 log 확인. R2가 R1 뒤에 잘 붙어있음.


* f75f8de (HEAD) R2

* 43a38df R1

* 4e9dd84 (master) M1

| * f5dc64d (rb) R3

| * 20fd541 R2

| * 6f0c444 R1

|/

* 3b42f60 1


git rebase --continue 

-R2의 둘째줄과 R3의 둘째줄이 겹치기 때문에 또 오류 메시지 뜸

-수동으로 수정 후 log 확인. R3가 R2 뒤에 잘 붙어있음.


* a0c8cb4 (HEAD -> rb) R3

* f75f8de R2

* 43a38df R1

* 4e9dd84 (master) M1

* 3b42f60 1


1. git remote와 git push

・git remote add origin https://github.com/da91love/Myrepo

-https://github.com/da91love/Myrepo의 깃을 git init된 로컬의 디렉토리와 연결시킨다.

-https://github.com/da91love/Myrepo저장소를 origin이라는 닉네임으로 가르키기로 한다.


・git remote

-현재 연결된 원격 저장소를 확인해볼 수 있다.


・git remote remove origin2

-연결된 원격 저장소를 지운다.


・git push -u origin master

-처음 push를 시행할 때 필요한 명령어로 origin 원격 저장소와 master 브랜치를 연결시킨다.

-이후부터는 git push만 하면, 최신 커밑이 원격저장소로 푸쉬된다.



2. git clone

git clone https://github.com/da91love/git.git gitsrc

(git clone https://github.com/da91love/git.git ./gitsrc)

-해당 주소의 원격 저장소를 현재 디렉토리의 하위 디렉토리인 gitsrc로 다운받는다.

-git clone https://github.com/da91love/git.git . 하면 현재 디렉토리로 다운받는다.

-clone 명령어를 사용하면 해당 로컬에서는 init를 하지 않는다. 왜냐하면 .git디렉토리까지 원격 저장소에서 모두 가져오기 때문이다.

-clone과 pull 의 다른 점은 clone은 git repository 전체를 가져오는 것이고, pull은 파일만 가져온다.



3. 하나의 원격저장소를 2개의 지역저장소가 사용하는 방법(push와 pull)


git clone 원격저장소의 주소 git_home (저장하고 싶은 디렉토리를 지정) <-- 집에 있는 컴

git clone 원격저장소의 주소 git_office (저장하고 싶은 디렉토리를 지정) <-- 회사에 있는 컴

집에서 프로젝트를 할 경우

vim f1.txt파일의 내용 변경 > 담c > git commit -am 2

git log

3으로 했어야 하는데 > 바꾸면 됨 > git commit --amend (--amend개정하다라는 뜻,

커밋 메시지를 변경가능/커밋할 내용을 누락시켰을 경우에는 add를 한 후 다시 이것을 하면 마지막 메시지를 바꿀 수 있는데 

그것은 원격저장소로 올리전에 해야 함(지역저장소에 있는 경우 > 자신의 컴퓨터에 있는 경우에만 해야 되고 그 이후에는 여러분은 하면 안된다고 생각하면 좋음

이유: push이후 내용은 수정하지 마라)

3이라고 내용을 변경하고 :wq

git log > 2가 3으로 변경된 것을 확인할 수 있음

git push > ID + 비번 > 요런식으로 푸쉬가 되고

깃허브에 보니 커밋이 추가되었고 방금 커밋한 것이 올라와 있음(3:55)


작업을 끝내고 회사로 갈 것임

회사에서 작업하기 전에 항상 

git pull(당겨온다 )master에 있고 마스터는 오리진에 연결되어 있을 것임

여러분들이 클로닝을 했기 때문에 그런경우 그냥 git pull만 하면 됨

원격저장소의 내용을 로컬저장소로 가져오게 됨

그때 ID와 패스워드를 묻지 않는 것은 여러분이 공개 저장소를 쓰기 때문임

그럼 여기서 작업을 할 것임

ls -al > git log > vim f1.txt > d > git commit -am '4' > git push > ID 패스워드 입력



4. 로그인 없이 원격 저장소 이용하기 (Github)

・ssh-keygen

-로컬의 루트 디렉토리에 .ssh파일을 생성한다.

-.ssh파일안에는 id_rsa와 id_rsa.pub파일이 들어있는데, id_rsa은 private key이고 id_rsa.pub은 public key이다.

-id_rsa키를 가지고 있으면 id_rsa.pub와 연결가능(id_rsa키를 가지고 있는 데스크탑과 github가 연결됨)


・cat id_rsa.pub

-id_rsa.pub파일이 가지고 있는 암호키를 보여준다. 정교하게 카피해서 아래의 github사이트에 붙여준다.

-github.com → settings → ssh and gpg key → New SSH key 등록

-git push -u origin master 입력하지 않고, git push만 입력해도 push 가능

1. branch의 원리, Head의 원리


오브젝트 id란, 40개의 숫자의 영문자의 조합으로 이루어진 것으로 커밑 당시의 폴더구조와 파일내용의 전체 상태를 가르키는 참조값이다.


・git init 

-.git/HEAD 파일이 생성되고 그 파일은 .git/refs/heads/master를 값으로 지닌다.

(master는 디폴트 브랜치)

-아직 커밑을 한번도 하지 않았기 때문에,.git/refs/heads/master파일은 존재하지 않는 상태

-.git/HEAD : 현재 속해있는 브랜치의 디렉토리 주소(.git/refs/heads/[브랜치 이름])를 값으로 지니게 됨.

-.git/HEAD과 .git/refs/heads/master는 바이너리 값이아니라 모두 텍스트 값을 갖는다.



・git commit

-.git/refs/heads/master는 최신 커밑 상태의 오브젝트 id값을 가지게 됨. 



・git branch exp

-.git/refs/heads/exp 파일을 생성하고, 그 파일은 최신 커밑 상태의 오브젝트 id값을 가지게 됨.

-이때 드는 의문이, 처음으로 만들어진 브랜치는 최신 커밑이 없는데 어떤 오브젝트 id를 갖나? 라는 것인데,'최신' 커밑 상태의 오브젝트 id값에서 의미하는 바와 같이, 최초에 브랜치가 생성되면 아직 exp 의 내용에 변화가 없기때문에 master의 최신 커밑 상태의 오브젝트 id값과 exp의 최신 커밑 상태의 오브젝트 id값은 동일하게 됨.

-아직 브랜치가 옮겨지지 않았기 때문에 .git/HEAD 파일은 .git/refs/heads/master를 값으로 지닌다.


 



・git checkout exp

-브랜치의 위치가 변화했기 때문에, .git/HEAD 파일은 .git/refs/heads/exp를 값으로 지닌다.



・git commit

-.git/refs/heads/exp는 최신 커밑 상태의 오브젝트 id값을 가지게 됨. 






2.되돌아가기 - reset과 checkout
・git reset --hard 93c95176






・아래 그림에서 refs/heads/master 의 최신 커밑 상태의 오브젝트 id값이 93c95176로 바뀐 것을 볼 수 있다.
-그럼 4의  커밑 상태의 오브젝트 id값이 없어졌을까?



・ORIG_HEAD : 삭제한 커밑을 가르킴
-ORIG_HEAD는 reset과 같은 명령을 시행할시, 삭제될 커밑을 저장해둠
-ORIG_HEAD는 4번 커밑의 오브젝트 id인 f3ea13을 가지고 있음
-그런데, 이때 3단계로 돌아가는게 아니라 2단계로 돌아간다고 하면, ORIG_HEAD는 3번 커밑의 오브젝트 id과 4번 커밑의 오브젝트 id을 모두 들고 있을까? 아니다, 최신 커밑의 오브젝트 id인 4번만 들고있는다.

・git reset --hard ORIG_HEAD
-reset하기 전으로 돌아감

・git reflog 하면 내가 했던 커밑을 쪼르륵 보여줌


・git checkout 은 이후에 브랜치 명 뿐만아니라 커밑아이디를 직접 적을 수도 있다.
-이때 checkout 명령으로 되돌아가면, .git/HEAD의 값이  .git/refs/heads/master와 같은 브랜치를 가르치는 것이 아니라 커밑 상태의 오브젝트 id를 직접 갖고 있는 것을 볼 수 있는데, git checkout master 를 시행하여 ./git/HEAD을 .git/refs/heads/master로 변경해준다.





3.reset의 soft,mixed,hard



(git reset 5c5184를 때리면, reset 커밑 오브젝트 id의 위쪽에서 변화가 발생한다)


-.git/objects : add와 commit에 의해 생성된 오브젝트 id가 쌓이는 가장 중요한 폴더.
각각의 파일은 오브젝트 id가 파일명으로 지정되어 있으며, 바이너리 형식이다.
add에 의해 추가되는 오브젝트 id파일은 파일의 내용을 바이너리로 담고있으며, 이를 blob라고 한다.
commit에 의해 추가되는 오브젝트 id파일은 커밑당시의 모든 디렉토리와 파일의 상태(당시의 blob들,parent)를 담는다.
-.git/index.file : 바이너리 형식이며 add 명령어를 시행할시 파일의 파일명만을 담는다. 
-.git/HEAD.file : 현재 속한 브랜치의 .git/refs/heads/[브랜치명]을 텍스트 형식으로 담는다.
-.git/refs/heads/[브랜치명].file : 최신의 커밑 오브젝트 id 값을 텍스트 형식으로 담는다.
-.git/ORIG_HEAD.file : reset과 같은 명령 시행시, 삭제된 커밑 오브젝트 id값을 텍스트형식으로 담는다.


+ Recent posts