2021-05-12 14:32:11
Git基本操作
git clone [-b 分支名] chenlong@http://project/admin.git
不帶-b引數預設master分支
git clone http://project/admin.git
git clone –progress -v http://project/admin.git
git.exe clone –progress -v “http://project/admin.git” “192.168.0.105wwwother_userchenlongadmin”
設定 -> git 編輯本地 .git/config 增加
[credential]
helper = store
git clone @http://project/admin.git admin2
git checkout — application/core/MY_Exceptions.php
git reset HEAD(commit) file
git reset –hard HEAD~3
會將最新的3次提交全部重置,就像沒有提交過一樣。
git reset 版本號 — b.txt
在Windows平台下面就有這個該死的行分隔符的問題,一般推薦
git config –global core.autocrlf false
另外還可以
git config –global core.safecrlf true
保證檔案的行分隔符不會混雜。 然後以防萬一重新git checkout或者git reset –hard一下
================================================================================================================================
檢視blob
git show 6ff87c4664 檢視blob
檢視樹
git ls-tree fb3a8bdd0ce 檢視tree
注意:所有的檔案的mode位都是644 或 755,這意味著Git只關心檔案的可執行位.
檢視某個提交
git show -s –pretty=raw 2be7fcb476
檢視tag
git cat-file tag v1.5.0
每個目錄都建立了 tree物件 (包括根目錄), 每個檔案都建立了一個對應的 blob物件 . 最後有一個 commit物件 來指向根tree物件(root of trees), 這樣我們就可以追蹤專案每一項提交內容.
一個commit包含
一個tree
父物件 (parent(s))
作者author
提交者committer
|– HEAD # 這個git專案當前處在哪個分支裡
|– config # 專案的設定資訊,git config命令會改動它
|– description # 專案的描述資訊
|– hooks/ # 系統預設勾點指令碼目錄
|– index # 索引檔案
|– logs/ # 各個refs的歷史資訊
|– objects/ # Git本地倉庫的所有物件 (commits, trees, blobs, tags)
`– refs/ # 標識你專案裡的每個分支指向了哪個提交(commit)。
.git/refs/heads/master
.git/refs/remotes/origin/master
//add了沒有commit
Changes to be committed:
(use “git reset HEAD…” to unstage)
new file: yyy
//原來的檔案修改了 沒有add
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git checkout –…” to discard changes in working directory)
modified: test
//新檔案沒有add過的
Untracked files:
(use “git add…” to include in what will be committed)
xxx
git config –global user.name “Scott Chacon”
git config –global user.email “schacon@gmail.com”
Clone一個倉庫
git clone http://www.kernel.org/pub/scm/git/git.git [dir]
初始化一個新的倉庫
git init
除了用git add 命令,我還可以用
$ git commit -a
這會自動把所有內容被修改的檔案(不包括新建立的檔案)都新增到索引中,並且同時把它們提交。相當於add + commit
Git跟蹤的是內容不是檔案
git add 不但是用來新增不在版本控制中的新檔案,也用於新增已在版本控制中但是剛修改過的檔案;
在這兩種情況下, Git都會獲得當前檔案的快照並且把內容暫存(stage)到索引中,為下一次commit做好準備。
例如:
修改了test ,git add 後 看
Changes to be committed:
modified: mmm
再修改test git status看
Changes to be committed:
modified: mmm
Changes not staged for commit:
modified: mmm
分支與合併@基礎
檢視當前分支
git branch
建立
git branch test
切換到某個分支
git checkout branch
合併
git merge test
Git鼓勵大量使用分支:
檢視分支:git branch
建立分支:git branch name
切換分支:git checkout name
建立+切換分支:git checkout -b name
合併某分支到當前分支:git merge name 合併後的操作2個分支看起來都是一樣的
刪除分支:git branch -d name
修改的還沒add的為 a版本,修改了add了的為 index版本,已經commit過的為 c版本,已經push的為 r版本。
git diff
來找你當前工作目錄和上次提交與本地索引間的差異 (即a版本和c版本)
git diff –cached
看在下次提交時要提交的內容(staged,新增到索引中) (即index版本和c版本)
git diff master..test
git diff master…test 比父分支
.gitignore 忽略檔案不提示在Untracked files裡
git stash 儲存某個時間狀態
http://gitbook.liuhui998.com/3_6.html
http://gitbook.liuhui998.com/4_9.html
Git的撤消操作 – 重置, 簽出 和 撤消
===================================9.24==================================================================
版本回退(未push出去之前):
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交“ 3628164…882e1e0”(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
$ git reset –hard HEAD^
HEAD is now at ea34578 add distributed
紀錄檔 git log 會清除掉
又想回到最新的 git reflog檢視歷史 找到最新的 id
再回來
$ git reset –hard 3628164
HEAD is now at 3628164 append GPL
命令git checkout — readme.txt意思就是,把readme.txt檔案在工作區的修改全部復原,這裡有兩種情況:
一種是readme.txt自修改後還沒有被放到暫存區,現在,復原修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經新增到暫存區後,又作了修改,現在,復原修改就回到新增到暫存區後的狀態。
總之,就是讓這個檔案回到最近一次git commit或git add時的狀態。
復原修改:
場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout — file。
場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要復原本次提交,參考版本回退一節,不過前提是沒有推播到遠端庫。
git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
請問git rm –cache 和 git reset HEAD 的區別到底在哪裡呢?
在 git add <somefile> 之後,有的時候提示用“git rm –cache”來unstage,有的時候卻是提示用“git reset HEAD”。
如果要刪除檔案,最好用git rm file_name,而不應該直接在工作區直接rm file_name。
如果一個檔案已經add到暫存區,還沒有commit,此時如果不想要這個檔案了,有兩種方法:
1,用版本庫內容清空暫存區,git reset HEAD
2,只把特定檔案從暫存區刪除,git rm –cache file
>> 有的時候提示用“git rm –cache”來unstage
HEAD 裡沒有 <somefile> 時提示
>> 有的時候卻是提示用“git reset HEAD”。
HEAD 裡有 <somefile> 時提示
新增遠端repo:
git remote add upstream https://github.com/linuxidc/first.git
要關聯一個遠端庫,使用命令git remote add origin git@server-name:path/repo-name.git;
關聯後,使用命令git push -u origin master第一次推播master分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推播最新修改;
分散式版本系統的最大好處之一是在本地工作完全不需要考慮遠端庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕幹活的!當有網路的時候,再把本地提交推播一下就完成了同步,真是太方便了!
git push
-u, –set-upstream
https://github.com/linuxidc/first.git
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "upstream"]
url = https://github.com/linuxidc/first.git
fetch = +refs/heads/*:refs/remotes/upstream/*
執行git push –set-upstream upstream master後
[branch "master"]
remote = upstream
merge = refs/heads/master
git remote add upstream https://github.com/linuxidc/first.git
git push -u upstream master
或
git push –set-upstream upstream master
後
Branch master set up to track remote branch master from upstream.
檢視檔案 cat .git/config 多了內容
[branch "master"]
remote = upstream
merge = refs/heads/master
[root@chenlong first]# git push -u upstream master
Username for ‘https://github.com’: zxsz
Password for ‘https://zxsz@github.com’:
fatal: Authentication failed
git config –global push.default simple/matching
下面說一下push.default matching和push.default simple的區別:
push.default設定maching的意思是:git push 會把你本地所有分支push到名稱相對應的遠端主機上。這意味著可能你會在不經意間push一些你原本沒打算push的分支。
push.default設定simple的意思是:git push僅僅把當前所在分支push到從當初git pull pull下來的那個對應分支上,另外,這個過程也會同時檢查各個分支的名稱是否相對應。
[root@VM_44_174_CentOS first]# git push github master
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/linuxidc/first.git/info/refs
git remote set-url github https://github.com/linuxidc/first.git
ssh-keygen -t rsa -C “chenlongtest_txyun”
[remote "origin"]
fetch = + refs/heads/*:refs/remotes/origin/*
url = https://github.com/linuxidc/first.git
url = git@github.com:linuxidc/first.git
git log –graph –pretty=oneline
https://www.kernel.org/pub/software/scm/git/
centos 安裝報錯
make[1]: *** Error 2
yum install perl-ExtUtils-MakeMaker package
/bin/sh: msgfmt: command not found
yum install gettext-devel
git branch –merged
git branch –no-merged 檢視尚未合併的工作
git branch -D test 強制刪除分支
用於有修改未commit的情況
git stash 儲存當前現場
git stash list
git stash apply stash@{0}
git stash drop來刪除
等同於
git stash pop
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
git merge –no-ff -m “merged bug fix 101″ issue-101
因此,多人共同作業的工作模式通常是這樣:
首先,可以試圖用git push origin branch-name推播自己的修改;
如果推播失敗,則因為遠端分支比你的本地更新,需要先用git pull試圖合併;
如果合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用git push origin branch-name推播就能成功!
如果git pull提示“no tracking information”,則說明本地分支和遠端分支的連結關係沒有建立,用命令git branch –set-upstream branch-name origin/branch-name。
這就是多人共同作業的工作模式,一旦熟悉了,就非常簡單。
建議遠端的 分支
git checkout -b branch-name origin/branch-name
建立本地分支和遠端分支的關聯,使用git branch –set-upstream branch-name origin/branch-name
[chenlong@MD101 first]$git checkout -b dev3 origin/dev3
fatal: Cannot update paths and switch to branch ‘dev3′ at the same time.
Did you intend to checkout ‘origin/dev3′ which can not be resolved as commit?
[chenlong@MD101 first]$git branch dev3
git checkout dev3
git push origin –delete
git log –pretty=oneline –abbrev-commit
標籤:
git tag 檢視標籤名稱列表
git tag 標簽名
git tag 標簽名 commit版本號
git show 標簽名
還可以建立帶有說明的標籤,用-a指定標簽名,-m指定說明文字:
$ git tag -a v0.1 -m “version 0.1 released” 3628164
git tag -s v0.2 -m “version 0.1 released” 3628164 -s gpl加密
git tag -d v0.1
git push origin v1.0
git push origin –tags 推播所有
如果標籤已經推播到遠端,要刪除遠端標籤就麻煩一點,先從本地刪除:
[chenlong@MD101 first]$git tag -d v0.7
Deleted tag ‘v0.7′ (was feb7a94)
然後,從遠端刪除。刪除命令也是push,但是格式如下:
[chenlong@MD101 first]$git push origin :refs/tags/v0.7 有空格
To git@github.com:linuxidc/first.git
- [deleted] v0.7
自定義
git config –global color.ui true
.gitignore檔案
git config –global alias.unstage ‘reset HEAD’
git unstage test.py 等同於
git reset HEAD test.py
git config –global alias.lg “log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset’ –abbrev-commit”
搭建git伺服器
如果希望ssh公鑰生效,.ssh目錄的許可權必須是0700, .ssh/authorized_keys檔案許可權必須是0600。
git:x:1000:1000::/home/git:/usr/bin/git-shell
git clone git@203.195.207.137:/data/git_res/test.git
相關文章