git的使用

下載了源文件,沒有類似於“setup.py”“webstorm.sh”的文件,無法安裝。

https://github.com/Moeditor/Moeditor

-----------------------------------------------------------------------

關於ubuntu下使用git比較好的說明:

https://blog.csdn.net/vslyu/article/details/80337675

一些常見的命令:

git   --version     查看版本

git  config      查看配置的相關命令行,具體而言

 

全局設置,當有變更的時候會提示相關人並給相關人的email發郵件,當沒有設置全局的時候,在變更提交的時候會有waring提示提示你設置,global對當前用戶所有倉庫有用:

git config   --global  user.name  "your name"   

git config    --global   user.email  "your [email protected]"

 

顯示當前的已經有的config設置,則加“   --list”,同樣的會有 --global   --system  --local(當前):

git config  --list   --global

git config  --list    --system :第一次使用git的時候可能會有錯誤,“fatal: unable to read config file '/etc/gitconfig': 沒有那個文件或目錄”

git  config  --list    --local :默認情況。等同於“git config  --list”。當然你必須得保證你現在已經在“當前倉庫”了。

-------------------------------------------

創建倉庫:

1.git init,先有項目了,後期添加git。(不建議此種方式,此種方式下,git初始化之前項目的變更過程被miss掉了)

administrator@ubuntu:/host/js_html_css/git$ git init
/  **已初始化空的 Git 倉庫於 /host/js_html_css/git/.git/**  /

2.先建git倉庫後,再做項目

administrator@ubuntu:/host/js_html_css/git$ git init  first-git
 /** 已初始化空的 Git 倉庫於 /host/js_html_css/git/first-git/.git/   **/

untracked files 通常翻譯成“未被管理的文件”。

------------------------------------

圖形化工具(逼格不高不建議使用)

sudo apt install gitk  安裝

gitk(".git"文件夾存在的條件下打開,打開也是在當前的文件夾下打開,或者cd到相應的文件夾下)

------------------------------------

git add   : 添加到暫存區

unstage :暫存區

 

git  commit  -m  "備註"    :提交(通常與git add連續操作,因此git commit不帶文件名,而需要“備註”)

git commit --amend  進入類vim/vi界面修改最近一次的“備註”。amend:修理。我的版本是ctrl+x退出vim/vi(:wq)

一般而言,完整的commit操作步驟大概是這樣的:

git add xxx --->git diff --cached --->git commit -m "ooxxoox".

 

git status  :查看倉庫此時的狀態,並且會顯示當前工作所在的分支。

git cat-file  -t    :"t"=type,查看類型

git cat-file  -p   查看具體的內容

git  branch -av  查看所在的分支

 

git log  -n1 : 查看最近一次的變更。“n1”可以隨意的變化,git log  -n2,表示查看最近2次的變更。

git diff  commit1(hash)  commit2(hash): 比較commit1/commit2的差異。

git diff  HEAD  HEAD^(HEAD^^/HEAD^^^....or  HEAD~1/HEAD~2/HEAD~3):指向不明,未熟練之前不建議使用。

 

 

-----------------------

一些常見的錯誤提示

you  are in "detached HEAD" state.

detached   adj.單獨的; 獨立的; 不連接的; 

HEAD 這個詞的翻譯最好翻譯成線"頭"。它在.git文件夾裏是確實存在的。直接查看.git/Head文件會看到當前的工作的線頭所處的分支。使用命令git checkout temp(temp爲任意分支)可以切換分支,切換分支也可在.git/HEAD文件下明白的顯示出來。

因此,"detached HEAD"可以翻譯成"分離頭"。

線頭HEAD必須得與分支branch綁定在一起,否則就算commit了。git也認爲是不重要的commit,不會在全局的樹(gitk查看)上顯示出來,過段時間也會清理掉。因此,當報錯"you  are in "detached HEAD" state."的時候,應當要注意。

要想處於"detached HEAD state",可以使用命令 :git checkout  當前的commit的hash值 。當處於"detahced HEAD"的時候,所在的修改如果最後沒有與分支branch綁定在一起的話,最後會失去該變更。因此,可以把“detached  HEAD”當做一種“草稿紙”,如果最後的更改不滿意,則可置之不理,git管理軟件過段時間會自動打掃,清理掉類似的狀況所產生的無效變更。

當然,如果在“草稿紙”狀態(detached head state)下的更改很符合自己的意圖,則需要將線頭head連接到某一個具體的分支branch上。操作命令如下:git  branch  新建的分支名(branch)  commit(detached HEAD ,hash值)

------------------

git branch 分支名: 創建分支

git branch  -v:  查看倉庫分支情況

git branch  -av:查看倉庫分支情況

git branch -d:刪除分支。(分離頭狀態下的commit由於系統過段時間會自動刪除掉,所以不存在刪除分離頭的命令)

git branch  -D:git  branch -d刪除不掉的情況下使用。強制刪除。

 

------

git rebase   

git rebase  -i  commit(hash,需要更改哪一個則找到上一級的commit對應的hash),出現如下的交互(i="interact"的英文含義)界面:(此界面非常以及及其的重要,#下列出了所有的可能的操作,這些操作都是相對於"pick"而言的,更改hash前的"pick"成對應的命令縮寫(p/r/e/s/f/x/d),可對相應的hash 進行操作。)

pick 4c879a6 aa.txt
pick ecb9a77 direcory_babel__00

# 變基 f4ecf17..ecb9a77 到 f4ecf17(2 個提交)
#
# 命令:
# p, pick = 使用提交
# r, reword = 使用提交,但修改提交說明
# e, edit = 使用提交,但停止以便進行提交修補
# s, squash = 使用提交,但和前一個版本融合
# f, fixup = 類似於 "squash",但丟棄提交說明日誌
# x, exec = 使用 shell 運行命令(此行剩餘部分)
# d, drop = 刪除提交
#
# 這些行可以被重新排序;它們會被從上至下地執行。
#
# 如果您在這裏刪除一行,對應的提交將會丟失。
#
# 然而,如果您刪除全部內容,變基操作將會終止。

一共會跳出2次的vim界面,上面是第一次的vim界面。在此界面中從#下的說明中選擇合適的命令或者命令縮寫代替"pick"。

#將pick 4c879a6 aa.txt中的pick替換成r,表示選擇的命令是"r"對應的命令
r   4c879a6 aa.txt

保存之後,會出現第二次的vim 界面,大概的情況是這樣的(以命令“reword/r”爲例,即修改message):

 

#此處爲commit修改後的message名字:
利用git rebase -i修改非最近的commit的message啊~,兩次跳出vim界面兩次修改。

# 請爲您的變更輸入提交說明。以 '#' 開始的行將被忽略,而一個空的提交
# 說明將會終止提交。
#
# 日期:  Tue Aug 6 11:04:24 2019 +0800
#
# 交互式變基操作正在進行中;至 f4ecf17
# 最後一條命令已完成(1 條命令被執行):
#    reword 9872349 利用git rebase -i修改非最近的commit的message啊~,兩次跳出vi$
# 接下來要執行的命令(剩餘 1 條命令):
#    pick fafee13 direcory_babel__00
# 您在執行將分支 'master' 變基到 'f4ecf17' 的操作時編輯提交。
#
# 要提交的變更:
#       新文件:   aa.txt
#       新文件:   babel/.babelrc
#       新文件:   babel/dependencies
#       新文件:   babel/lib/zhuanhuan.js

將多個commit合成一個commit:

1.git  rebase  -i  父級commit   ---》2.進入第一個vim界面:保留第一個pick作爲squash進去的對象,後面的對應的commit前的“pick”換成“s”或者"squash"(squash:使... 擠進; 塞入)  ----》3.進入第二個vim/vi界面:具體的如何的"squash",即將多個commit合成(squash)一個commit。具體的如下:

#進入第一個vim界面:保留第一個pick作爲squash進去的對象,後面的對應的commit前的“pick”換成“s”或 
 # 者squash
#第一個作爲squash進去的對象,不需要更改
pick 26f4f83 001

#後面2個pick改成“s”/“squash”
s 5a2a19d 002
squash 1ebff7f 003

# 變基 db5cdb8..1ebff7f 到 db5cdb8(3 個提交)
#
# 命令:
# p, pic
........
...........
#進入第二個vim/vi界面:具體的如何的"squash",即將多個commit合成(squash)一個commit           


# 這是一個 3 個提交的組合。
# 這是第一個提交說明:

001(這裏可以更改,以後3個commit都以更改後的形象出現)

# 這是提交說明 #2:

002(這裏也可以更改)

# 這是提交說明 #3:

003(這裏還是可以更改)


如果要合併的commit是第一個commit,無法找到父級,可以直接用這個commit進入命令提示操作git rebase -i xxx(即第一個vi界面)。進入界面之後,再將此第一個commit按照格式添加進去,同時把不需要合併的commit刪除掉,需要作爲靶子的squash進去的對象可以往前提到最前,同時將相應的pick修改成對應的命令。-----------從以上可以看出,git rebase -i xxx是把xxx之前的所有的commit全部在第一個vi界面顯示出來,在此界面下,操作者的自由非常的大,可以添加commit,可以剔除掉某個commit(刪除請慎重,本地文件也可被刪除,但是可以通過checkout到別的branch恢復),還可以通過修改"pick"換成對應的操作來達到相應的目的

 

操作中如果操作不當,會提醒你使用下列命令(此操作不可使用或者務必慎用,否則會把本地的文件給刪除掉):

rm -fr "/host/js_html_css/quanzhan_development/.git/rebase-merge"

 

要說明的是,這種修改會改變自身commit的hash值,也會改變子集元素的hash值,聯合操作的時候不應該有這種操作,否則會影響到其他的人。 

--------------------------------------------------

工作區  暫存區   HEAD

unstage && HEAD

流程是這樣的: 已經納入git管理的文件被修改了--》git add xxx(暫存區unstage)--》git  diff  --cached(雙破折號“--”,比較暫存區和HEAD,HEAD可以是分離頭狀態,也可以是連接到某個branch上的狀態。) --》git commit  -m ""

簡單的而言,以後提交的流程多了個操作的步驟git diff --cached,變成:

 git add xxx --->git diff --cached --->git commit -m "ooxxoox".

 

工作區&&HEAD(commit)

工作區--》git add xxx,添加到暫存區--》git commit -m"",提交到HEAD(detached head/branch)。git diff 還可以比較工作區和已經提交了的commit(head)的比較

git diff :查看工作區和head(commit)的所有的差異。會把所有的文件的差異都羅列出來。[這裏說的不準確。關於git diff 的補充說明。git diff 先是比較工作區和暫存區的變化,再比較工作區和head的變化,有優先級的關係。即當工作區,暫存區,HEAD都存在的差異的時候,git diff 只會顯示工作區和暫存區的差異。但是一般的時候,只有暫存區往往跟head沒有差異或者不存在三種差異同時存在的情況。故而原先的結論部分成立。]

git diff   --文件1  文件2  文件3:文件1/2/3之間用空格隔開,可以只有1個文件。意思是把“--”後所有的文件在工作區和提交後在branch/head上的差異顯示出來。(此條區別具體文件有無更改的命令無法使用,不知何故??但是區分所有差異的命令“git diff ”可以使用。ubuntu環境。補充說明,當前環境下,不用破折號“--”,直接後帶文件可以此命令:“git diff 文件1 文件2 文件3”。這與視頻中的講解有所不同。)

 

特殊關係:當一個工作區的變更add到暫存區的時候,原來的工作區的變更神祕的消失了,這個時候比較工作區和HEAD,發現原來的存在的變更後的文件的差異也消失了。但是,暫存區和HEAD的變更後的文件的差異卻存在了,這個差異可以使用git diff --cached查看。理解這個關係,可以更好的理解工作區-暫存區-HEAD三者之間的關係。(注:git status----暫存區的文件通常在bash中以綠色字出現。工作區的文件如果變更了在bash中以紅色的字體出現。git diff 系列命令  ---文件差異中增加的內容以綠色的字體出現,刪去的內容以紅色的字體出現)

 

取消暫存區的變更:

//當變更存在於暫存區的時候,會有如下的提示:
要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

1.取消暫存區的所有的變更:git reset HEAD

2.取消暫存區的某一個文件的變更:git reset HEAD 文件名

注意:取消暫存區的變更後,則執行的是“特殊關係”的反面,此時暫存區&&HEAD不存在差異,但是工作區&&HEAD卻又開始存在差異了。

 

工作區的變更不如暫存區的變更,使用命令使工作區的變更還原到暫存區的變更:

git checkout 文件名(視頻中用的是“git checkout  --文件名”,本環境與視頻中的操作略有不同)

 

簡言之,暫存區的不想要用git reset HEAD  --文件名,工作區的不想要用git checkout  文件名,存在下面的鏈式關係:

工作區 --》(git checkout 恢復到)暫存區---》(git reset HEAD  恢復到) HEAD

 

刪除某個節點之前的變更:

 先要確定已經在某一個具體的分支下(沒有這一步就是亂來),git reset  --hard   +某個具體的節點的hash值。效果是在該分支上面的,該具體的節點之前的所有的變更全部取消。 “--hard”這個命令“暗示”這個命令應該慎用!!要注意的是,“git reset  --hard   某個具體的節點的hash值”可以是別的分支上的節點的hash值,這麼做的後果是該條分支上所有的變更都失效,且hash對應的節點所在分支下的所有的變更,包括該節點本身都會出現2條branch,一條是原先的branch一條是被刪光所有變更的branch。

 

git diff 後還可以跟兩個不同的分支名,用以區別2個分支的所產生的變更的不同,具體的:

git  diff  branch1(or 該分支上最後1次commit的hash)   branch2(or 該分支上最後1次commit的hash)   --xxx(具體的某一個文件名)。該命令表示查找出branch1/branch2上xxx文件(變更)的不同。[注:本次使用無法帶上“--xxx”,不知何故?]

administrator@ubuntu:/host/js_html_css/quanzhan_development$ git diff yy master --/BB.txt
/*報錯以下內容,ubuntu環境*/
usage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]

-------------------

文件的更改和刪除

git  mv  文件名1 文件名2 

將branch上的文件名1改成文件名2.同時,本地的文件也會發生同樣的變化。

 

git  rm  文件名

刪除掉branch上的文件。本地文件也會被刪除。刪除文件也是作爲一個變更提交到相應的branch上的,因此當要錯誤刪除某一個文件而想要恢復它的時候,可以採取之前的取消變更的操作:git reset --hard  HEAD

---------------------

git stash

git stash  --list

git stash  apply

git stash  pop

 

.gitignore 1.這個文件主要用來忽略不需要被納入.git管理的文件名2.這個文件只能叫這個文件名,否則不起作用。(好奇:不add到暫存區不提交,也不會被納入管理,爲何不這麼做呢?難道只是爲了“git status”的時候不出現沒有紅色字表示的被納入管理的文件?)

 

---------------

複合的命令的分解

1. git checkout    -b   fix_readme   fix_css

這個命令的意思是在fix_css下再創建一個新的分支的分支fix_readme,創建完分支之後,當前工作的內容再從原來的分支branch(當前的工作所在的分支不一定是fix_css)或者線頭head所指向的commit切換checkout到新創建的fix_readme。

2.git  branch  新建的分支名(branch)  commit(detached HEAD ,hash值)

創建一個新的分支branch,並將處於分離頭狀態(detached HEAD)的commit(hash值)掛到branch上。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章