关于Git的备忘录

因为最近我遇到了一些处理子模块的问题,所以我趁此机会学习了一下git。这是一篇备忘录,整理了Pro Git的内容,以便自己参考。

总结。

    • gitはsvnのような差分管理ではなく、ファイル単位で管理されている。

 

    • git cloneは最新のコミットのみではなく、過去のコミットを含む全てをクローンする(一部のフックなどを除く)。

 

    • ファイルの状態には、大別して、gitの管理状態を意味するtrackedファイルと管理外のuntrackedファイルがある。

 

    • trackedファイルの状態には,unmodified, staging, modifiedがある。

 

    stagingのファイルがコミット対象になる。

基本

将文件设置为跟踪目标,或者将其设置为暂存状态

这是一本我喜欢的书。
这本书是我喜欢的。
我喜欢这本书。

git add a.c # そのファイルをstaging状態にする。

git add . # dir(この場合./)を指定するとそのディレクトリを再帰的に追加する。
git add a.c # a.cをstaging状態にする。
vim a.c # 何か編集する。 a.cはmodified状態になる。
        # この時点でcommitしても、staging状態がコミットされる。
git add a.c # a.cがstaging状態になる。
git commit -a # 未stagingをstaging状態にして、commitする。通常はこちら

将staging状态恢复为modified状态。

git reset HEAD filename

将已更改的内容恢复成最近一次提交的内容。

git checkout -- filename

展示差分

git diff # 作業ディレクトリの内容とstaging状態の差を表示する。
git diff --staged # staging状態と直近のコミットとの差を表示する。
git diff --check で空白等の余計な文字を(X)で教えてくれる。

提交


git commit # -mを指定しない場合、環境変数$EDITORで登録された
           # エディタが起動され、コメント入力できる。

git commit --amend # 直近のコミットに対して上書きする。
                   # 直近のコミットにコメントを上書きしたり、変更を追加できたりする。

删除文件

git rm file

将文件移动

git mv from to
#上記は、以下のショートカット
mv from to
git rm from
git add to

暂时隐藏作业状态

git stash # 現在の作業ファイル等をスタックに記録し、直近のコミット状態に戻す。

git stash list # 一覧の表示

git stash apply # 直近のstash状態を復元する.ただしstagin状態は戻らない.
                # stackの内容は消えない。
git stash apply --index # sgit stash applyに加えtaging状態も戻す。

git stash drop # 直近のスタックを削除する。

git stash pop # 直近のstash状態を復元して、スタックから削除する.

git stash show -p | git apply -R # 直近のstash applyを戻す。
# git config --global alias.stash-unapply '!git stash show -p | git apply -R'しておくと良い。

git stash branch branch-name # stashで隠した作業ディレクトリから新しいブランチを作成する。

遠程操作

git remote # リモート名の一覧を確認できる。
git remote -v # 名前に対応するURLも表示する。


git remote add remote-name repository-url # リモートリポジトリ追加

git remote show remote-name # リモートの詳細表示

git fetch remote-name # リモートリポジトリの情報を取得するのみで、ローカルリポジトリの内容は変更されない。

git pull # リモートの状態を取得して、ローカルリポジトリにマージする。

git push remote-name repository-url # リモートへローカルリポジトリの内容を更新する。

git remote rm remote-name # リモートの設定を削除する

标签

git tag # 一覧表示
git tag -l 'v1.*' # 検索

git show tag-text # タグの詳細を表示する

git tag -a tag-text -m "comment" # 注釈付き(現在のスナップショットの複製を作る)

git tag version # 軽量タグ(branchを作る)

发布标签

git tag -s v1.5 -m "comment"

git describe # ビルド番号を自動生成する.

git archive master --prefix=my_project/ # アーカイブファイルを生成する。

分支

    HEADポインタは、参照しているコミットのスナップショットを指す。

创建分支

git branch branchname# 作成するだけ。切り替えない。

显示分支列表

git branch
git branch -v # 直近のコミットログを確認
git branch --merged # マージされたブランチの一覧を確認する。
git branch --no-merged # 未マージの一覧を確認する。

切换分支

    ブランチの変更は、作業中のファイルやstaginファイルがある場合できない。
git checkout branch-name # HEADをbranch-nameを差し替えて、作業ディレクトリをそのブランチのスナップ状態に戻す。

git checkout -b new-branch-name # 新しいブランチを作成して、HEADをそれに切り替える。

合并分支

    • マージ元が直接マージ先に到達できるときは、fast-forwardといい、HEADのの位置を差し替えるだけ.

 

    複数のブランチがマージされる場合、自動的に新しいスナップショットを作成して、コミットする。
git merge branch-name # 現在のブランチにbranch-nameのブランチ内容をマージする。

删除分支

git brach -d branch-name

如果发生冲突

git status # コンフリクトしたファイルの確認。解決していないファイルは、unmanagedとして表示される。
vim filename # コンフリクトしたファイルを編集する。
             #<<<<<<<<< ======== >>>>>>>のコンフリクト部分を編集して、望むの状態にする。
git add filename # コンフリクトの解決済みにする。
git commit
git mergetool # 外部のマージツールでマージ作業を行う

远程分支

    ブランチ名は、remote-name/branch-name。

获取远程分支的信息

git fetch origin # リモートブランチの情報をローカルに取得する。(取得するだけ)

通知远程分支的修改

git push # git push remote-name from-branchname:to-branchnameの省略計

检出远程分支

git checkout -b local-branch-name remote-name/branch-name # ローカル名local-branch-nameでリモートのブランチをチェックアウトする。

删除远程分支

git push remote-name :bracn-name

合并(rebase/merge)

    公開リポジトリにpushしたブランチへのrebaseはダメ。

基本形态

git checkout branch_b
git rebase master # branch_bの内容がmasterにマージされて、branch_bのスナップショットは、masterのリビジョンに移動する。
                  # ただしbranchはbranch_bのまま。

git checkout master
git merge branch_b # これでmasterにbranch_bの内容を反映する。

–走到

git rebase --onto master branch_a branch_b # branch_bの変更と、branch_bに関連するbranch_aの変更をmasterに反映して、branch_bのmaster上に移動する。
      #ただしbranchはbranch_bのまま

git checkout master
git merge branch_b # これでmasterにbranch_bの内容を反映する。
git log --no-merges remote-name/branch-name ^local-branch # masterからlocal-branchの間に、マージが必要なブランチを表示する

分散操作

提交请求

git request-pull remote-name/branch-name local-branch-name # プルリクエストする

将多个提交合并为一个。

以下是一个例子:

git checkout -b ver2 origin/master
git merge --no-commit --squash local_branch
git commit
git push origin master 

创建补丁

    diff形式とmbox形式の二つある
git format-patch # mbox形式のパッチが作成できる。

发电子邮件

    gitのconfigファイルでメールの設定が行える。
git send-email *.patch

应用补丁

git apply difffile # git diffからマージする
git apply --check difffile マージできるか確認する。

git am patchfile # format-patch形式のパッチを適用する。
git am -3 patchfile # 3方向マージを行う
git am -i -3 atchfile # 対話的にパッチを行える。

挑选最好的

git cherry-pick commit-ssh # 特定のコミットを現在のブランチにマージする

指定范围的提交

git log master..my-branch # my-branchから辿れて、masterからは辿れないブランチのログを表示する。

git log origin/master..HEAD # プッシュしようとしているコミットを表示する。
# 次の3つは同じ意味
git log refA..refB
git log ^refA refB
git log revB --not refA
git log master...experiment # どちらからか辿れるコミットが表示される

git log -left-right masterc..branch_name # どちら向きのコミットかを表示する

历史的改写

只希望不要经常使用。

    • ログを変えるだけなら git commit –amend

 

    コミットした内容を消したり、変更するにはgit rebase -i HEAD-3みたいな感じ。

子模块

添加子模块

    submodule addすると、.gitmodulesファイルという設定ファイルが作られる。
git submodule add other-repository # リポジトリ配下に別のリポジトリを含める

git commit # submoduleがaddしたことをコミットする。

克隆包含子模块的代码库。

git clone repository
git submodule init
git submodule update

从远程合并和更新子模块的内容

    • git submodule updateを行うと、サブモジュールに変更がなくても、ローカルの変更を断りなく変更する。

 

    • サブモジュールを親プロジェクトから編集する場合は、git checkout -b tempなど別のブランチを作成した方が変更が失われなくて良い。

 

    親プロジェクト内のファイルをサブモジュール化するには、手順が必要。
git merge origin/master #submoduleのHEADポインタは変わるけど、ファイルは更新されていない。
git submodule update # これでマージされる。   

(※ 正在制作中)

方便

自动补全

当将contrib/completion目录中的.git-completion.bash复制到~/时,会感到一丝幸福。

git config --global alias.co checkout # gitの操作にaliasを作成できる。
git config --global alias.xxx '!git xxx' # !で始めると、外部のコマンドを指定できる。

其他

git clone url dir # dirにリポジトリをcloneする
广告
将在 10 秒后关闭
bannerAds