gitとgithubを用いてコード開発環境を構築する


手順は次のとおりです.
    1. に従ってhttps://help.github.com/articles/generating-ssh-keysローカルLinuxとgithubを確立するという.comのリンクとテストに合格しました.
    2. githubでcomに独自のプロジェクトrepoを新規作成します.ここではhelloと名付けてテストします.
    3. ローカルディレクトリの下/path/to/helloでgit pullを実行[email protected]:you_github_user_name/hello.git
これにより、helloを作成するなど、ローカル/path/to/helloでプロジェクトファイルを追加できます.goのソースファイルを保存します.次にgit add helloを実行する.goとgit commit-a-m「my test file」
   4. このときgit pushを実行する[email protected]:you_githubuser_name/hello.git、コマンドが成功するとgithubにいます.comでhelloを見ました.goファイルがコミットされました!
またgit pushで毎回指定しないでほしい場合は
 push [email protected]:you_github_username/hello.gitは、git remote add originなどのプロジェクトに別名を付けることで簡略化できます[email protected]:you_github_username/hello.gitは、次回のプロジェクトのコミット操作時にgit commit-a-m「*」&git pushで直接コミットを完了できます.このときのコミットはmasterの下に直接コミットされます.
より多くのgitとgithub操作は、次の文章を参照してください.https://github.com/chenzhiwei/linux/tree/master/git 

gitの関連構成


gitの使用


gitserverの構築:https://github.com/chenzhiwei/linux/blob/master/git/build-git-server.mkd

グローバル設定

$ git config --global user.name "Chen Zhiwei"
$ git config --global user.email [email protected]

構成が完了すると$HOMEディレクトリの下に1つ生成する.gitconfigプロファイル、具体的な参考例.--localは、これらの内容をプロジェクトに書き込むものである.git/configファイルでは、プロジェクトごとに異なる構成が可能です.

自動補完


gitをインストールした後に自動補完機能がない場合は、次の操作で補完機能を追加できます.再ログインする必要があります.
$ wget -O /etc/profile.d/git-completion.sh https://raw.github.com/git/git/master/contrib/completion/git-completion.bash

使用開始

  • 新しいgit倉庫
  • を作成
    $ mkdir git_repo
    $ cd git_repo
    $ git init
    $ echo "test" > README.mkd
    $ git add README.mkd
    $ git commit -m "add README.mkd file"
    $ git remote add origin [email protected]:username/test.git
    $ git push -u origin master
  • 既存のgit倉庫
  • を使用
    $ cd git_repo
    $ git remote add origin [email protected]:username/test.git
    $ git push -u origin master

    ヒントfatal: remote origin already exists.が提示された場合、ローカル・ウェアハウスにはすでにリモート・アドレスがあることに注意してください.まずgit remote rm originを使用してoriginを削除するか、git remote add other_name [email protected]:username/test.gitを使用して追加できます(コミット時にgit push -u other_name masterを使用してください).

    ローカル・ウェアハウスに2つのミラーを作成


    既存の倉庫アドレスを次のように仮定します[email protected]:chenzhiwei/linux.git
    $ git clone [email protected]:chenzhiwei/linux.git
    $ cd linux
    $ git remote add backup [email protected]:chenzhiwei/linux.git
    $ git push -u backup master

    その後、変更するたびに、最後のpushで2つのコマンドを実行する必要があります.
    $ git push origin
    $ git push backup

    pushを1回だけ実行する2つのリモートウェアハウスにコミットする場合は、ウェアハウスルートディレクトリの下を変更する必要があります.git/configファイル、次の内容を追加します.
    [remote "both"]
        url = [email protected]:chenzhiwei/linux.git
        url = [email protected]:chenzhiwei/linux.git

    その後、git push bothを使用して更新を2つのリモート・ウェアハウスに送信できます.
    あるいはbackupブランチのアドレスをoriginブランチに直接書きます.
    [remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = [email protected]:chenzhiwei/linux.git
        url = [email protected]:chenzhiwei/linux.git

    注意:Git 2.0では、デフォルトのpushアクションが「現在のbranchからリモートウェアハウスへのpushのみ」に変更されます.git push bothコマンドを継続するには、git pushのデフォルト動作git config --global push.default matchingを手動で設定する必要があります.push.defaultにはいくつかの簡単な動作があり、ここではmatchingsimpleを紹介し、両者はそれぞれpushローカルのすべてのブランチから遠隔倉庫とpushローカルの現在のブランチから上流ブランチを意味する.この解釈はまだ正確ではないようで、man git-configで詳細な説明を見ることができます.
    完全なgit/configファイルの例は次のとおりです.
    [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
    [remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = [email protected]:chenzhiwei/linux.git
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    [remote "backup"]
        url = [email protected]:chenzhiwei/linux.git
        fetch = +refs/heads/*:refs/remotes/backup/*
    [remote "both"]
        url = [email protected]:chenzhiwei/linux.git
        url = [email protected]:chenzhiwei/linux.git

    既存の倉庫に孤児ブランチを作成する


    孤児ブランチは、ブランチに何もないことを意味し、以前に作成した他のブランチとは何の関連もありません.
    $ git clone [email protected]:chenzhiwei/test.git
    $ cd test
    $ git checkout --orphan new_branch
    Switched to a new branch 'new_branch'
    $ git rm -rf . #              
    $ rm .gitignore #            
    $ echo "orphan branch" > README.mkd
    $ git add .
    $ git commit -m "add README.mkd file"
    $ git push origin new_branch

    リモートgit倉庫への単一ブランチのコミット

    git pushコマンドは、デフォルトではすべてのブランチをgitウェアハウスにコミットします.リモートウェアハウスにブランチをコミットしたい場合は、git push origin HEADを使用する必要があります.もちろん、git config --global push.default trackingコマンドを使用して、git pushのデフォルト操作を変更することもできます.これは、git pushを実行するときに、現在のブランチがリモートgit倉庫にのみコミットされることを意味します.

    git常用命令


    以下のいくつかはgitでよく使われる命令で、簡単に理解できます.

    git config


    gitを使用する前に、個人情報と使用の好みを設定したほうがいいです.以下の命令の意味は説明するまでもないでしょう.以下の命令を実行すると、あなたの家のディレクトリ(~)の下にファイル~/.gitconfigが生成されます.
    $ git config --global user.name "Chen Zhiwei"
    $ git config --global user.email [email protected]
    $ git config --global core.editor vim
    $ git config --global merge.tool vimdiff
    $ git config --global color.status auto
    $ git config --global color.branch auto
    $ git config --global color.interactive auto
    $ git config --global color.diff auto
    $ git config --global push.default simple
    $ git config --global alias.co checkout
    $ git config --global alias.ci commit
    $ git config --global alias.st status
    $ git config --global alias.last 'log -1 HEAD'
    $ git config --global alias.unstage 'reset HEAD --'

    git add


    ファイルの内容をインデックスに追加(ファイルを一時保存)するには、いくつかの簡単な例があります.
    $ git add .
    $ git add --all
    $ git add *.txt
    $ git add directory/*.sh

    突然git addになりたくない場合は、次のコマンドを実行します.
    $ git reset .
    $ git reset *.txt
    $ git reset directory/*.sh

    git rm


    インデックスと当時の作業ディレクトリのファイルを削除します.
    $ git rm filename
    $ git rm -f *.txt
    $ git rm -r .

    git commit


    現在の変更を倉庫に記録します.つまり、変更をローカル倉庫にコミットします.
    $ git commit -m "add a file and remove a file"

    突然git commitになりたくない場合は、次のコマンドを実行します.
    $ git reset HEAD^
    commit以降、ファイルが追加されていないことに気づきました.
    $ git commit -m'msg'
    $ git add forget_file
    $ git commit --amend

    あなたのcommitはすでにリモートブランチ(master)にpushしています.今、後悔したいと思っています.
    $ git clone [email protected]:chenzhiwei/test.git
    $ cd test
    $ git reset HEAD^
    $ git push -f master

    git status


    現在の作業ディレクトリのステータス、すなわち、どのファイルが変更、追加、削除されたかを表示します.
    $ git status

    git checkout


    現在の作業ディレクトリにブランチとディレクトリをチェックアウトすると、ブランチを切り替えるコマンドとして簡単に理解できます.
    次のコマンドは、ブランチbranch 1に切り替え、新しいブランチnewを作成します.branch .
    $ git checkout branch1
    $ git checkout -b new_branch

    ローカル変更をキャンセル:
    $ git checkout -- file_name

    git branch

  • ブランチのリスト、作成、削除.

  • 次のコマンドは、ローカルブランチ、すべてのブランチ、リモートブランチ、作成、削除、強制ブランチのリストです.
    $ git branch --list
    $ git branch --all
    $ git branch --remotes
    $ git branch new_branch
    $ git branch --delete branch_name
    $ git branch -D branch_name

    remote tracking branchを削除すると、git branch -rコマンドにリストされているブランチです.
    $ git branch -r
    $ git branch -d -r origin/develop
  • 連結ブランチ
  • 競合が発生した場合は、手動で競合を解決すればよい.
    $ git checkout branch_name
    $ git checkout master
    $ git merge branch_name
  • リモートブランチ
  • を削除する.
    ブランチをマージした後、以前のブランチが不要になった場合は、ローカルおよびリモートで削除できます.
    $ git branch -d branch_name
    $ git branch -D branch_name
    $ git push origin :branch_name

    このコマンドは興味深いですね.そのうちoriginはあなたのリモート倉庫の名前です(git remote -vは表示できます).

    git diff


    変更内容を表示します.
    $ git diff filename
    $ git diff .
    $ git diff revision1 revision2
    $ git diff branch1 branch2

    DIFF一時保存(インデックスに追加)ファイル:
    $ git add .
    $ git diff --cached

    View the redundant Tab or Space in your codes:
    $ git diff --check
    $ git diff --check --cached

    変更されたファイルのみを表示します.
    $ git diff --name-only

    git init


    git log


    git merge


    git mv


    git pull


    git push


    git rebase


    コードを取得した後(masterブランチと仮定)、ブランチを作成し、このブランチを変更しました.もう一人もコード(masterブランチと仮定)を取得し、このブランチを修正してリモートにコミットしました.この場合、リモートからブランチのコードを再検索し、作成したブランチに切り替えてrebaseコマンドを実行する必要があります.このブランチのbaseブランチが変わったので、baseブランチにマージするには、baseブランチを再削除する必要があります.
    $ git clone -b master [email protected]:chenzhiwei/test.git
    $ git checkout -b new_branch
    $ git checkout master
    $ git pull
    $ git checkout new_branch
    $ git rebase
    $ git rebase --continue
    git rebaseを実行するとファイルの競合が発生する可能性があります.この場合、手動で競合を解決し、解決した後にrebaseを続行する必要があります.

    git revert


    git reset


    うっかりgit add .を実行すると、git reset命令で破ることができます.
    最近のcommitを削除しますが、今回のcommitで変更した内容を保持します.つまり、git statusで表示すると、コミット待ちのファイルが表示されます.
    $ git reset --soft HEAD^

    最近のcommitを削除し、今回のcommitの変更内容は保持されません.つまり、git statusで表示すると変更は表示されません.

    git stash


    ローカル倉庫のファイルを修正したが、修正を放棄したい場合は、git stashで倉庫の元の状態に復元できます.

    git submodule


    gitは分散型で、毎回repo全体をダウンロードして変更を提出するしかありません.これは明らかに合理的ではありません.多くの場合、コードを少し変更したいだけで、このコードがあるディレクトリcloneを降りるだけでいいからです.この問題を解決するためにgitはsubmoduleを導入し,すなわち1つのgit repoに複数のchild git repoを含めることができる.
    大きなプロジェクトには、多くのモジュールとサブプロジェクトが含まれているに違いありません.これらのモジュールとサブプロジェクトをそれぞれgit repoにして、大きなプロジェクトのgit repoで含めることができます.例えば、以下のようにします.
    1つのプロジェクト(foo)にはサブプロジェクト(bar)が含まれており、メインプロジェクトのrepoはhttps://github.com/chenzhiwei/linuxであり、サブプロジェクトのrepoアドレスはhttps://github.com/chenzhiwei/vimであり、git submoduleの作成を完了するには以下の操作が必要である.
    $ git clone https://github.com/chenzhiwei/linux
    $ cd linux
    $ git submodule add https://github.com/chenzhiwei/vim vim
    $ git status
    $ git commit -m"add a submodule vim"
    git submodule addコマンドは、.gitmodulesファイルを生成し、現在のディレクトリの下にもvimというrepoが表示されます.
    他のcloneの場合、デフォルトではvimのコードcloneは下がりません.vimというsubmoduleはローカルファイルシステム上でディレクトリであり、git repoでは空のテキストファイルです.submodule、すなわちサブプロジェクトのコードもすべてcloneしたい場合は、次の操作を実行する必要があります.
    $ git clone https://github.com/chenzhiwei/linux
    $ cd linux
    $ git submodule init
    $ git submodule update

    submoduleの削除
    $ git rm -r submodule

    git tag


    個人的にはbranchよりも機能が強いと感じています.tagに注釈を付けることができるからです.
    $ git tag -a tagname -m"tag message"
    $ git tag tagname -f -m"new tag message"
    $ git push origin tagname
    $ git push orgin :tagname
    $ git push --delete orgin tagname
    $ git push orgin :refs/tags/tagname

    git blame


    ファイルの行コードが誰とどのcommitで変更されたかを表示します.
    $ git blame filename

    filenameファイルのすべての行がいつ追加されたのか、誰に追加されたのか、誰にどのcommitに追加されたのかがリストされます.

    その他


    自分のプロジェクトにgithubにmirrorを作成する

    # In this example, we use an external account named extuser and
    # a GitHub account named ghuser to transfer repo.git
    
    git clone --bare https://githost.org/extuser/repo.git
    # Make a bare clone of the external repository to a local directory
    
    cd repo.git
    git push --mirror https://github.com/ghuser/repo.git
    # Push mirror to new GitHub repository
    
    cd ..
    rm -rf repo.git
    # Remove temporary local repository

    私は寝たいので、先に書かないでください.