<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.laptrinhblockchain.net//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thangdb</id>
		<title>CodeForLife - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.laptrinhblockchain.net//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thangdb"/>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=Special:Contributions/Thangdb"/>
		<updated>2026-10-02T21:36:14Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=916</id>
		<title>Mô hình sử dụng GIT và một số lệnh hay dùng</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=916"/>
				<updated>2022-05-14T06:22:32Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== '''Mô hình sử dụng GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Việc quản lý branch trong GIT rất linh động, do đó thường mỗi công ty sẽ sử dụng mô hình riêng cho phù hợp với hiện trạng công ty.&amp;lt;br/&amp;gt; Thường khuyến khích mọi người sử dụng mô hình sau:&amp;amp;nbsp;'''[https://nvie.com/posts/a-successful-git-branching-model/ A successful Git branching model]'''&lt;br /&gt;
&lt;br /&gt;
[[File:Git-model-2x.png|600px|Git-model-2x.png]]&lt;br /&gt;
&lt;br /&gt;
Theo mô hình này sẽ có hai nhánh chính:&lt;br /&gt;
&lt;br /&gt;
*'''master''': Đây là nhánh chính thứ&amp;amp;nbsp;nhất, nơi chứa source code sẵn sàng để triển khai. &lt;br /&gt;
*'''develop''': Đây là nhánh chính thứ hai, chứa source code phát triển mới nhất cho lần triển khai sắp tới. Nhánh này là nhánh tích hợp, chứa các commit hàng ngày của các thành viên phát triển. Khi nào nhánh này đạt đến trạng thái &amp;quot;'''ổn định'''&amp;quot;, sẵn sàng cho việc triển khai thì sẽ được merge sang nhánh master. Việc merge từ develop vào master cần phải được kiểm soát chặt chẽ để đảm bảo an toàn. &lt;br /&gt;
&lt;br /&gt;
Bên cạnh hai nhánh chính ở trên, chúng ta còn sử dụng thêm các nhánh hỗ trợ khác để hỗ trợ phát triển song song giữa các Nhóm/Thành viên, theo dõi việc phát triển theo từng tính năng, chuẩn bị release sản phẩm hoặc khắc phục nhanh các lỗi trên môi trường thật.&amp;amp;nbsp;Không giống như các nhánh chính, các nhánh này luôn có thời gian sống hạn chế, vì chúng sẽ bị loại bỏ cuối cùng.&lt;br /&gt;
&lt;br /&gt;
*'''Feature branches''': Nhánh sử dụng để phát triển tính năng mới cho bản triển khai sắp tới hoặc trong tương lai xa. Bản chất nhánh này tồn tại khi tính năng đang được phát triển, được merge vào nhánh develop nếu thành công và bị loại bỏ nếu thử nghiệm không thành công. Tên nhánh thường đặt theo tên feature để tiện theo dõi. &lt;br /&gt;
*'''Release branches''':&amp;amp;nbsp;Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''release-*''' &lt;br /&gt;
*'''Hotfix branches''': Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''hotfix-*''' &lt;br /&gt;
&lt;br /&gt;
Sau khi triển khai source code trên nhánh master thành công trên môi trường thật, thì thực hiện '''tag''' lại để lưu lại commit được sử dụng để triển khai.&lt;br /&gt;
&lt;br /&gt;
== '''Một số lệnh hay dùng trong GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q]&lt;br /&gt;
&lt;br /&gt;
=== '''Bảo vệ branch master''' ===&lt;br /&gt;
&lt;br /&gt;
Thông thường, nhánh master là nhánh quan trọng, chứa source code triển khai, vì vậy nhánh master này cần phải được bảo vệ để tránh các lệnh nguy hiểm.&amp;lt;br/&amp;gt; Để bảo vệ nhánh master này, bạn vào giao diện trên web, chọn '''Project '''=&amp;gt; Vào mục '''Setting '''của Project =&amp;gt;&amp;amp;nbsp;'''Repository''':&lt;br /&gt;
&lt;br /&gt;
[[File:Git protect branch.png|800px|Git protect branch.png]]&lt;br /&gt;
&lt;br /&gt;
Tại giao diện này, bạn có thể Protect/Unprotect một nhánh bất kỳ. Nhánh master luôn luôn phải được Protect để đảm bảo an toàn.&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo tag''' ===&lt;br /&gt;
&lt;br /&gt;
Sau khi source trên nhánh develop được triển khai, source trên nhánh develop sẽ được merge sang nhánh master. Chúng ta cần đánh dấu lại commit này trên master tương ứng với lần triển khai.&amp;lt;br/&amp;gt; Chúng ta tạo tag để làm việc này. Lệnh tạo tag như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git tag -a v5.0 -m &amp;quot;Create tag for release: Support new LTC coin&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; git push origin v5.0&amp;amp;nbsp;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Checkout tag bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git fetch --all --tags --prune&amp;lt;br/&amp;gt; git checkout tags/&amp;lt;tag_name&amp;gt; - b&amp;amp;nbsp;&amp;lt;branch_name&amp;gt;&amp;lt;br/&amp;gt; git checkout tags/v5.0 -b v5.0''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo branch mới''' ===&lt;br /&gt;
&lt;br /&gt;
Hiện tại bạn đang sửa code ở Local và muốn '''đẩy code ở Local&amp;amp;nbsp;lên Server''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn muốn '''clone source code từ master sang một branch mới''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa branch''' ===&lt;br /&gt;
&lt;br /&gt;
Trong thời gian phát triển sẽ có nhiều nhánh thừa, nhánh tạm và bạn sẽ có nhu cầu xóa bỏ chúng.&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa remote branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh '''xóa một remote branch''' (Branch trên server) như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout '''branch_name'''&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git push origin --delete '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa local branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh sau ép xóa một branch ở local, khi xóa phải đứng ở một branch khác:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git branch -D '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== '''Merge source code''' ===&lt;br /&gt;
&lt;br /&gt;
'''* C1: &amp;lt;u&amp;gt;Sử dụng giao diện Web&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Thông thương khi phát triển sẽ tạo nhiều branch khác nhau và sẽ có nhiều lúc bạn cần thực hiện lệnh merge source code giữa hai nhánh.&lt;br /&gt;
&lt;br /&gt;
Để '''an toàn''' bạn nên thực hiện lệnh merge trên website: Chọn '''Project''' =&amp;gt; '''Merge Requests''' =&amp;gt; Kích nút &amp;quot;'''New merge request'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 01.png|800px|Git merge branch 01.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 02.png|800px|Git merge branch 02.png]]&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Rebase&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Sử dụng rebase sẽ giữ lại được hết các commit nhưng bù lại thì nó phức tạp hơn và có nhiều rủi ro hơn.&amp;lt;br/&amp;gt; Lệnh sau để merge source code từ nhánh '''dev '''sang nhánh '''master''':&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout dev&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git rebase master&amp;lt;br/&amp;gt; git checkout master&amp;lt;br/&amp;gt; git merge --no-ff dev&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Merge&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Để đơn giản thì tốt nhất nên dùng '''GIT MERGE''' sẽ an toàn hơn nhưng sẽ có 1 số commit không được lưu lại.&amp;lt;br/&amp;gt; Ví dụ bạn muốn merge branch1 vào branch2 bạn thực hiện các lệnh sau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout branch1&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout branch2&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git merge branch1''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa commit trên remote''' ===&lt;br /&gt;
&lt;br /&gt;
Nếu bạn muốn lùi source code về commit trước đó bạn có thể thực hiện bằng 02 cách:&lt;br /&gt;
&lt;br /&gt;
*'''C1''': Tạo commit revert =&amp;gt; Cách này sẽ tạo thêm một commit khác và&amp;amp;nbsp;khi đó các branch khác có liên quan commit này phải rebase lại. &lt;br /&gt;
*'''C2''': Xóa trực tiếp commit này. &lt;br /&gt;
&lt;br /&gt;
Để xóa một commit, branch phải đang ở chế độ Unprotect (Trên Git Web, vào '''Setting '''=&amp;gt; '''Repository '''=&amp;gt; Thực hiện &amp;quot;'''Unprotect'''&amp;quot;).&amp;lt;br/&amp;gt; Lệnh sau sẽ thực hiện xóa 01 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git reset --hard HEAD~1&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau sẽ thực hiện xóa 02 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git reset --hard HEAD~2&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;'''Chú ý''':&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nếu xóa trên nhánh master, sau khi xóa xong cần phải Protect lại.&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;HEAD~ tương đương với HEAD~1&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nên sử dụng lệnh git log để kiểm tra lại commit&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Lưu password cho GIT HTTP''' ===&lt;br /&gt;
&lt;br /&gt;
Từ phiên bản '''1.7.9''' trở lên, GIT không tự động lưu password khi sử dụng HTTP/HTTPS vì vấn đề bảo mật.&amp;lt;br/&amp;gt; Bạn muốn bật chế độ này phải đánh lệnh sau:&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git config --global credential.helper store''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git reset''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://www.atlassian.com/git/tutorials/undoing-changes/git-reset https://www.atlassian.com/git/tutorials/undoing-changes/git-reset]&lt;br /&gt;
&lt;br /&gt;
Lệnh '''git reset''' là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính. Các hình thức này tương ứng với các đối số dòng lệnh '''--soft''', '''--mixed''', '''--hard'''. Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git:&amp;amp;nbsp;'''The Commit Tree (HEAD)''', '''The Staging Index''', và '''The Working Directory'''.&lt;br /&gt;
&lt;br /&gt;
Bạn vừa add file A.js lên để chuẩn bị tạo commit, sau đó bạn không muốn đẩy file này trong commit nữa thì bạn sử dụng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git reset HEAD A.js''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn vừa tạo 1 commit nhưng chưa push lên server, nhưng commit này của bạn chưa đúng các file mà bạn cần. Bạn muốn loại bỏ commit này để tạo lại, bạn có thể dùng lệnh:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git reset --soft HEAD~''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git diff''' ===&lt;br /&gt;
&lt;br /&gt;
Lệnh sau hiển thị thay đổi ở tất cả các tệp:&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git diff&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Bạn muốn hiển thị các thay đổi của 1 file bạn đã sửa khi mà chưa thực hiện add hoặc commit:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 branch nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;branch&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff branch&amp;amp;nbsp;auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 commit nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trong trường hợp đã commit nhưng chưa push, bạn có thể xem các thay đổi bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff --cached&amp;lt;br/&amp;gt; git diff --cached&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nếu bạn so sánh thay đổi của 1 tệp giữa hai commit bạn thực hiện lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 04c0252 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Lệnh git difftool'''&lt;br /&gt;
&lt;br /&gt;
Lệnh này tương tự lệnh git diff, nhưng sử dụng thêm công cụ thứ 3 để view.&amp;lt;br/&amp;gt; Lệnh sau sẽ cho chọn công cụ:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git&amp;amp;nbsp;difftool&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau xác định luôn sử dụng công cụ nào:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git difftool --tool=winmerge&amp;lt;br/&amp;gt; git difftool --tool=winmerge client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tương tự cho các dạng khác.&lt;br /&gt;
&lt;br /&gt;
== '''Kiến thức thêm về GIT''' ==&lt;br /&gt;
&lt;br /&gt;
=== '''So sánh giữa&amp;amp;nbsp;HEAD^ và&amp;amp;nbsp;HEAD~''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git]&lt;br /&gt;
&lt;br /&gt;
[[File:Git reset 01.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[Category:Build và quản lý source code]]&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=914</id>
		<title>Mô hình sử dụng GIT và một số lệnh hay dùng</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=914"/>
				<updated>2021-11-20T15:20:44Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== '''Mô hình sử dụng GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Việc quản lý branch trong GIT rất linh động, do đó thường mỗi công ty sẽ sử dụng mô hình riêng cho phù hợp với hiện trạng công ty.&amp;lt;br/&amp;gt; Thường khuyến khích mọi người sử dụng mô hình sau:&amp;amp;nbsp;'''[https://nvie.com/posts/a-successful-git-branching-model/ A successful Git branching model]'''&lt;br /&gt;
&lt;br /&gt;
[[File:Git-model-2x.png|600px|Git-model-2x.png]]&lt;br /&gt;
&lt;br /&gt;
Theo mô hình này sẽ có hai nhánh chính:&lt;br /&gt;
&lt;br /&gt;
*'''master''': Đây là nhánh chính thứ&amp;amp;nbsp;nhất, nơi chứa source code sẵn sàng để triển khai. &lt;br /&gt;
*'''develop''': Đây là nhánh chính thứ hai, chứa source code phát triển mới nhất cho lần triển khai sắp tới. Nhánh này là nhánh tích hợp, chứa các commit hàng ngày của các thành viên phát triển. Khi nào nhánh này đạt đến trạng thái &amp;quot;'''ổn định'''&amp;quot;, sẵn sàng cho việc triển khai thì sẽ được merge sang nhánh master. Việc merge từ develop vào master cần phải được kiểm soát chặt chẽ để đảm bảo an toàn. &lt;br /&gt;
&lt;br /&gt;
Bên cạnh hai nhánh chính ở trên, chúng ta còn sử dụng thêm các nhánh hỗ trợ khác để hỗ trợ phát triển song song giữa các Nhóm/Thành viên, theo dõi việc phát triển theo từng tính năng, chuẩn bị release sản phẩm hoặc khắc phục nhanh các lỗi trên môi trường thật.&amp;amp;nbsp;Không giống như các nhánh chính, các nhánh này luôn có thời gian sống hạn chế, vì chúng sẽ bị loại bỏ cuối cùng.&lt;br /&gt;
&lt;br /&gt;
*'''Feature branches''': Nhánh sử dụng để phát triển tính năng mới cho bản triển khai sắp tới hoặc trong tương lai xa. Bản chất nhánh này tồn tại khi tính năng đang được phát triển, được merge vào nhánh develop nếu thành công và bị loại bỏ nếu thử nghiệm không thành công. Tên nhánh thường đặt theo tên feature để tiện theo dõi. &lt;br /&gt;
*'''Release branches''':&amp;amp;nbsp;Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''release-*''' &lt;br /&gt;
*'''Hotfix branches''': Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''hotfix-*''' &lt;br /&gt;
&lt;br /&gt;
Sau khi triển khai source code trên nhánh master thành công trên môi trường thật, thì thực hiện '''tag''' lại để lưu lại commit được sử dụng để triển khai.&lt;br /&gt;
&lt;br /&gt;
== '''Một số lệnh hay dùng trong GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q]&lt;br /&gt;
&lt;br /&gt;
=== '''Bảo vệ branch master''' ===&lt;br /&gt;
&lt;br /&gt;
Thông thường, nhánh master là nhánh quan trọng, chứa source code triển khai, vì vậy nhánh master này cần phải được bảo vệ để tránh các lệnh nguy hiểm.&amp;lt;br/&amp;gt; Để bảo vệ nhánh master này, bạn vào giao diện trên web, chọn '''Project '''=&amp;gt; Vào mục '''Setting '''của Project =&amp;gt;&amp;amp;nbsp;'''Repository''':&lt;br /&gt;
&lt;br /&gt;
[[File:Git protect branch.png|800px|Git protect branch.png]]&lt;br /&gt;
&lt;br /&gt;
Tại giao diện này, bạn có thể Protect/Unprotect một nhánh bất kỳ. Nhánh master luôn luôn phải được Protect để đảm bảo an toàn.&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo tag''' ===&lt;br /&gt;
&lt;br /&gt;
Sau khi source trên nhánh develop được triển khai, source trên nhánh develop sẽ được merge sang nhánh master. Chúng ta cần đánh dấu lại commit này trên master tương ứng với lần triển khai.&amp;lt;br/&amp;gt; Chúng ta tạo tag để làm việc này. Lệnh tạo tag như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git tag -a v5.0 -m &amp;quot;Create tag for release: Support new LTC coin&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; git push origin v5.0&amp;amp;nbsp;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Checkout tag bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git fetch --all --tags --prune&amp;lt;br/&amp;gt; git checkout tags/&amp;lt;tag_name&amp;gt; - b&amp;amp;nbsp;&amp;lt;branch_name&amp;gt;&amp;lt;br/&amp;gt; git checkout tags/v5.0 -b v5.0''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo branch mới''' ===&lt;br /&gt;
&lt;br /&gt;
Hiện tại bạn đang sửa code ở Local và muốn '''đẩy code ở Local&amp;amp;nbsp;lên Server''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn muốn '''clone source code từ master sang một branch mới''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa branch''' ===&lt;br /&gt;
&lt;br /&gt;
Trong thời gian phát triển sẽ có nhiều nhánh thừa, nhánh tạm và bạn sẽ có nhu cầu xóa bỏ chúng.&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa remote branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh '''xóa một remote branch''' (Branch trên server) như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout '''branch_name'''&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git push origin --delete '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa local branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh sau ép xóa một branch ở local, khi xóa phải đứng ở một branch khác:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git branch -D '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== '''Merge source code''' ===&lt;br /&gt;
&lt;br /&gt;
'''* C1: &amp;lt;u&amp;gt;Sử dụng giao diện Web&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Thông thương khi phát triển sẽ tạo nhiều branch khác nhau và sẽ có nhiều lúc bạn cần thực hiện lệnh merge source code giữa hai nhánh.&lt;br /&gt;
&lt;br /&gt;
Để '''an toàn''' bạn nên thực hiện lệnh merge trên website: Chọn '''Project''' =&amp;gt; '''Merge Requests''' =&amp;gt; Kích nút &amp;quot;'''New merge request'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 01.png|800px|Git merge branch 01.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 02.png|800px|Git merge branch 02.png]]&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Rebase&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Sử dụng rebase sẽ giữ lại được hết các commit nhưng bù lại thì nó phức tạp hơn và có nhiều rủi ro hơn.&amp;lt;br/&amp;gt; Lệnh sau để merge source code từ nhánh '''dev '''sang nhánh '''master''':&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout dev&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git rebase master&amp;lt;br/&amp;gt; git checkout master&amp;lt;br/&amp;gt; git merge --no-ff dev&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Merge&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Để đơn giản thì tốt nhất nên dùng '''GIT MERGE''' sẽ an toàn hơn nhưng sẽ có 1 số commit không được lưu lại.&amp;lt;br/&amp;gt; Ví dụ bạn muốn merge branch1 vào branch2 bạn thực hiện các lệnh sau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout branch1&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout branch2&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git merge branch1''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa commit trên remote''' ===&lt;br /&gt;
&lt;br /&gt;
Nếu bạn muốn lùi source code về commit trước đó bạn có thể thực hiện bằng 02 cách:&lt;br /&gt;
&lt;br /&gt;
*'''C1''': Tạo commit revert =&amp;gt; Cách này sẽ tạo thêm một commit khác và&amp;amp;nbsp;khi đó các branch khác có liên quan commit này phải rebase lại. &lt;br /&gt;
*'''C2''': Xóa trực tiếp commit này. &lt;br /&gt;
&lt;br /&gt;
Để xóa một commit, branch phải đang ở chế độ Unprotect (Trên Git Web, vào '''Setting '''=&amp;gt; '''Repository '''=&amp;gt; Thực hiện &amp;quot;'''Unprotect'''&amp;quot;).&amp;lt;br/&amp;gt; Lệnh sau sẽ thực hiện xóa 01 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git reset --hard HEAD~1&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau sẽ thực hiện xóa 02 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git reset --hard HEAD~2&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;'''Chú ý''':&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nếu xóa trên nhánh master, sau khi xóa xong cần phải Protect lại.&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;HEAD~ tương đương với HEAD~1&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nên sử dụng lệnh git log để kiểm tra lại commit&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Lưu password cho GIT HTTP''' ===&lt;br /&gt;
&lt;br /&gt;
Từ phiên bản '''1.7.9''' trở lên, GIT không tự động lưu password khi sử dụng HTTP/HTTPS vì vấn đề bảo mật.&amp;lt;br/&amp;gt; Bạn muốn bật chế độ này phải đánh lệnh sau:&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git config --global credential.helper store''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git reset''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://www.atlassian.com/git/tutorials/undoing-changes/git-reset https://www.atlassian.com/git/tutorials/undoing-changes/git-reset]&lt;br /&gt;
&lt;br /&gt;
Lệnh '''git reset''' là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính. Các hình thức này tương ứng với các đối số dòng lệnh '''--soft''', '''--mixed''', '''--hard'''. Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git:&amp;amp;nbsp;'''The Commit Tree (HEAD)''', '''The Staging Index''', và '''The Working Directory'''.&lt;br /&gt;
&lt;br /&gt;
Bạn vừa add file A.js lên để chuẩn bị tạo commit, sau đó bạn không muốn đẩy file này trong commit nữa thì bạn sử dụng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git reset HEAD A.js''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn vừa tạo 1 commit nhưng chưa push lên server, nhưng commit này của bạn chưa đúng các file mà bạn cần. Bạn muốn loại bỏ commit này để tạo lại, bạn có thể dùng lệnh:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git reset --soft HEAD~''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git diff''' ===&lt;br /&gt;
&lt;br /&gt;
Lệnh sau hiển thị thay đổi ở tất cả các tệp:&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git diff&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Bạn muốn hiển thị các thay đổi của 1 file bạn đã sửa khi mà chưa thực hiện add hoặc commit:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 commit nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trong trường hợp đã commit nhưng chưa push, bạn có thể xem các thay đổi bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff --cached&amp;lt;br/&amp;gt; git diff --cached&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nếu bạn so sánh thay đổi của 1 tệp giữa hai commit bạn thực hiện lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 04c0252 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Lệnh git difftool'''&lt;br /&gt;
&lt;br /&gt;
Lệnh này tương tự lệnh git diff, nhưng sử dụng thêm công cụ thứ 3 để view.&amp;lt;br/&amp;gt; Lệnh sau sẽ cho chọn công cụ:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git&amp;amp;nbsp;difftool&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau xác định luôn sử dụng công cụ nào:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git difftool --tool=winmerge&amp;lt;br/&amp;gt; git difftool --tool=winmerge client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tương tự cho các dạng khác.&lt;br /&gt;
&lt;br /&gt;
== '''Kiến thức thêm về GIT''' ==&lt;br /&gt;
&lt;br /&gt;
=== '''So sánh giữa&amp;amp;nbsp;HEAD^ và&amp;amp;nbsp;HEAD~''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git]&lt;br /&gt;
&lt;br /&gt;
[[File:Git reset 01.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[Category:Build và quản lý source code]]&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=913</id>
		<title>Mô hình sử dụng GIT và một số lệnh hay dùng</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=913"/>
				<updated>2021-07-01T04:04:05Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== '''Mô hình sử dụng GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Việc quản lý branch trong GIT rất linh động, do đó thường mỗi công ty sẽ sử dụng mô hình riêng cho phù hợp với hiện trạng công ty.&amp;lt;br/&amp;gt; Thường khuyến khích mọi người sử dụng mô hình sau:&amp;amp;nbsp;'''[https://nvie.com/posts/a-successful-git-branching-model/ A successful Git branching model]'''&lt;br /&gt;
&lt;br /&gt;
[[File:Git-model-2x.png|600px|Git-model-2x.png]]&lt;br /&gt;
&lt;br /&gt;
Theo mô hình này sẽ có hai nhánh chính:&lt;br /&gt;
&lt;br /&gt;
*'''master''': Đây là nhánh chính thứ&amp;amp;nbsp;nhất, nơi chứa source code sẵn sàng để triển khai. &lt;br /&gt;
*'''develop''': Đây là nhánh chính thứ hai, chứa source code phát triển mới nhất cho lần triển khai sắp tới. Nhánh này là nhánh tích hợp, chứa các commit hàng ngày của các thành viên phát triển. Khi nào nhánh này đạt đến trạng thái &amp;quot;'''ổn định'''&amp;quot;, sẵn sàng cho việc triển khai thì sẽ được merge sang nhánh master. Việc merge từ develop vào master cần phải được kiểm soát chặt chẽ để đảm bảo an toàn. &lt;br /&gt;
&lt;br /&gt;
Bên cạnh hai nhánh chính ở trên, chúng ta còn sử dụng thêm các nhánh hỗ trợ khác để hỗ trợ phát triển song song giữa các Nhóm/Thành viên, theo dõi việc phát triển theo từng tính năng, chuẩn bị release sản phẩm hoặc khắc phục nhanh các lỗi trên môi trường thật.&amp;amp;nbsp;Không giống như các nhánh chính, các nhánh này luôn có thời gian sống hạn chế, vì chúng sẽ bị loại bỏ cuối cùng.&lt;br /&gt;
&lt;br /&gt;
*'''Feature branches''': Nhánh sử dụng để phát triển tính năng mới cho bản triển khai sắp tới hoặc trong tương lai xa. Bản chất nhánh này tồn tại khi tính năng đang được phát triển, được merge vào nhánh develop nếu thành công và bị loại bỏ nếu thử nghiệm không thành công. Tên nhánh thường đặt theo tên feature để tiện theo dõi. &lt;br /&gt;
*'''Release branches''':&amp;amp;nbsp;Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''release-*''' &lt;br /&gt;
*'''Hotfix branches''': Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''hotfix-*''' &lt;br /&gt;
&lt;br /&gt;
Sau khi triển khai source code trên nhánh master thành công trên môi trường thật, thì thực hiện '''tag''' lại để lưu lại commit được sử dụng để triển khai.&lt;br /&gt;
&lt;br /&gt;
== '''Một số lệnh hay dùng trong GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q]&lt;br /&gt;
&lt;br /&gt;
=== '''Bảo vệ branch master''' ===&lt;br /&gt;
&lt;br /&gt;
Thông thường, nhánh master là nhánh quan trọng, chứa source code triển khai, vì vậy nhánh master này cần phải được bảo vệ để tránh các lệnh nguy hiểm.&amp;lt;br/&amp;gt; Để bảo vệ nhánh master này, bạn vào giao diện trên web, chọn '''Project '''=&amp;gt; Vào mục '''Setting '''của Project =&amp;gt;&amp;amp;nbsp;'''Repository''':&lt;br /&gt;
&lt;br /&gt;
[[File:Git protect branch.png|800px|Git protect branch.png]]&lt;br /&gt;
&lt;br /&gt;
Tại giao diện này, bạn có thể Protect/Unprotect một nhánh bất kỳ. Nhánh master luôn luôn phải được Protect để đảm bảo an toàn.&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo tag''' ===&lt;br /&gt;
&lt;br /&gt;
Sau khi source trên nhánh develop được triển khai, source trên nhánh develop sẽ được merge sang nhánh master. Chúng ta cần đánh dấu lại commit này trên master tương ứng với lần triển khai.&amp;lt;br/&amp;gt; Chúng ta tạo tag để làm việc này. Lệnh tạo tag như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git tag -a v5.0 -m &amp;quot;Create tag for release: Support new LTC coin&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; git push origin v5.0&amp;amp;nbsp;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Checkout tag bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git fetch --all --tags --prune&amp;lt;br/&amp;gt; git checkout tags/&amp;lt;tag_name&amp;gt; - b&amp;amp;nbsp;&amp;lt;branch_name&amp;gt;&amp;lt;br/&amp;gt; git checkout tags/v5.0 -b v5.0''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo branch mới''' ===&lt;br /&gt;
&lt;br /&gt;
Hiện tại bạn đang sửa code ở Local và muốn '''đẩy code ở Local&amp;amp;nbsp;lên Server''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn muốn '''clone source code từ master sang một branch mới''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa branch''' ===&lt;br /&gt;
&lt;br /&gt;
Trong thời gian phát triển sẽ có nhiều nhánh thừa, nhánh tạm và bạn sẽ có nhu cầu xóa bỏ chúng.&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa remote branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh '''xóa một remote branch''' (Branch trên server) như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout '''branch_name'''&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git push origin --delete '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa local branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh sau ép xóa một branch ở local, khi xóa phải đứng ở một branch khác:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git branch -D '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== '''Merge source code''' ===&lt;br /&gt;
&lt;br /&gt;
'''* C1: &amp;lt;u&amp;gt;Sử dụng giao diện Web&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Thông thương khi phát triển sẽ tạo nhiều branch khác nhau và sẽ có nhiều lúc bạn cần thực hiện lệnh merge source code giữa hai nhánh.&lt;br /&gt;
&lt;br /&gt;
Để '''an toàn''' bạn nên thực hiện lệnh merge trên website: Chọn '''Project''' =&amp;gt; '''Merge Requests''' =&amp;gt; Kích nút &amp;quot;'''New merge request'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 01.png|800px|Git merge branch 01.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 02.png|800px|Git merge branch 02.png]]&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Rebase&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Sử dụng rebase sẽ giữ lại được hết các commit nhưng bù lại thì nó phức tạp hơn và có nhiều rủi ro hơn.&amp;lt;br/&amp;gt; Lệnh sau để merge source code từ nhánh '''dev '''sang nhánh '''master''':&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout dev&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git rebase master&amp;lt;br/&amp;gt; git checkout master&amp;lt;br/&amp;gt; git merge --no-ff dev&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Merge&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Để đơn giản thì tốt nhất nên dùng '''GIT MERGE''' sẽ an toàn hơn nhưng sẽ có 1 số commit không được lưu lại.&amp;lt;br/&amp;gt; Ví dụ bạn muốn merge branch1 vào branch2 bạn thực hiện các lệnh sau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout branch1&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout branch2&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git merge branch1''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa commit trên remote''' ===&lt;br /&gt;
&lt;br /&gt;
Nếu bạn muốn lùi source code về commit trước đó bạn có thể thực hiện bằng 02 cách:&lt;br /&gt;
&lt;br /&gt;
*'''C1''': Tạo commit revert =&amp;gt; Cách này sẽ tạo thêm một commit khác và&amp;amp;nbsp;khi đó các branch khác có liên quan commit này phải rebase lại. &lt;br /&gt;
*'''C2''': Xóa trực tiếp commit này. &lt;br /&gt;
&lt;br /&gt;
Để xóa một commit, branch phải đang ở chế độ Unprotect (Trên Git Web, vào '''Setting '''=&amp;gt; '''Repository '''=&amp;gt; Thực hiện &amp;quot;'''Unprotect'''&amp;quot;).&amp;lt;br/&amp;gt; Lệnh sau sẽ thực hiện xóa 01 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git reset --hard HEAD~1&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau sẽ thực hiện xóa 02 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git reset --hard HEAD~2&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;'''Chú ý''':&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nếu xóa trên nhánh master, sau khi xóa xong cần phải Protect lại.&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;HEAD~ tương đương với HEAD~1&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nên sử dụng lệnh git log để kiểm tra lại commit&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Lưu password cho GIT HTTP''' ===&lt;br /&gt;
&lt;br /&gt;
Từ phiên bản '''1.7.9''' trở lên, GIT không tự động lưu password khi sử dụng HTTP/HTTPS vì vấn đề bảo mật.&amp;lt;br/&amp;gt; Bạn muốn bật chế độ này phải đánh lệnh sau:&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git config --global credential.helper store''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git reset''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://www.atlassian.com/git/tutorials/undoing-changes/git-reset https://www.atlassian.com/git/tutorials/undoing-changes/git-reset]&lt;br /&gt;
&lt;br /&gt;
Lệnh '''git reset''' là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính. Các hình thức này tương ứng với các đối số dòng lệnh '''--soft''', '''--mixed''', '''--hard'''. Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git:&amp;amp;nbsp;'''The Commit Tree (HEAD)''', '''The Staging Index''', và '''The Working Directory'''.&lt;br /&gt;
&lt;br /&gt;
Bạn vừa add file A.js lên để chuẩn bị tạo commit, sau đó bạn không muốn đẩy file này trong commit nữa thì bạn sử dụng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git reset HEAD A.js''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git diff''' ===&lt;br /&gt;
&lt;br /&gt;
Lệnh sau hiển thị thay đổi ở tất cả các tệp:&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git diff&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Bạn muốn hiển thị các thay đổi của 1 file bạn đã sửa khi mà chưa thực hiện add hoặc commit:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 commit nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trong trường hợp đã commit nhưng chưa push, bạn có thể xem các thay đổi bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff --cached&amp;lt;br/&amp;gt; git diff --cached&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nếu bạn so sánh thay đổi của 1 tệp giữa hai commit bạn thực hiện lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 04c0252 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Lệnh git difftool'''&lt;br /&gt;
&lt;br /&gt;
Lệnh này tương tự lệnh git diff, nhưng sử dụng thêm công cụ thứ 3 để view.&amp;lt;br/&amp;gt; Lệnh sau sẽ cho chọn công cụ:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git&amp;amp;nbsp;difftool&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau xác định luôn sử dụng công cụ nào:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git difftool --tool=winmerge&amp;lt;br/&amp;gt; git difftool --tool=winmerge client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tương tự cho các dạng khác.&lt;br /&gt;
&lt;br /&gt;
== '''Kiến thức thêm về GIT''' ==&lt;br /&gt;
&lt;br /&gt;
=== '''So sánh giữa&amp;amp;nbsp;HEAD^ và&amp;amp;nbsp;HEAD~''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git]&lt;br /&gt;
&lt;br /&gt;
[[File:Git reset 01.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[Category:Build và quản lý source code]]&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=912</id>
		<title>Mô hình sử dụng GIT và một số lệnh hay dùng</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=912"/>
				<updated>2021-06-21T03:22:36Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== '''Mô hình sử dụng GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Việc quản lý branch trong GIT rất linh động, do đó thường mỗi công ty sẽ sử dụng mô hình riêng cho phù hợp với hiện trạng công ty.&amp;lt;br/&amp;gt; Thường khuyến khích mọi người sử dụng mô hình sau:&amp;amp;nbsp;'''[https://nvie.com/posts/a-successful-git-branching-model/ A successful Git branching model]'''&lt;br /&gt;
&lt;br /&gt;
[[File:Git-model-2x.png|600px|Git-model-2x.png]]&lt;br /&gt;
&lt;br /&gt;
Theo mô hình này sẽ có hai nhánh chính:&lt;br /&gt;
&lt;br /&gt;
*'''master''': Đây là nhánh chính thứ&amp;amp;nbsp;nhất, nơi chứa source code sẵn sàng để triển khai. &lt;br /&gt;
*'''develop''': Đây là nhánh chính thứ hai, chứa source code phát triển mới nhất cho lần triển khai sắp tới. Nhánh này là nhánh tích hợp, chứa các commit hàng ngày của các thành viên phát triển. Khi nào nhánh này đạt đến trạng thái &amp;quot;'''ổn định'''&amp;quot;, sẵn sàng cho việc triển khai thì sẽ được merge sang nhánh master. Việc merge từ develop vào master cần phải được kiểm soát chặt chẽ để đảm bảo an toàn. &lt;br /&gt;
&lt;br /&gt;
Bên cạnh hai nhánh chính ở trên, chúng ta còn sử dụng thêm các nhánh hỗ trợ khác để hỗ trợ phát triển song song giữa các Nhóm/Thành viên, theo dõi việc phát triển theo từng tính năng, chuẩn bị release sản phẩm hoặc khắc phục nhanh các lỗi trên môi trường thật.&amp;amp;nbsp;Không giống như các nhánh chính, các nhánh này luôn có thời gian sống hạn chế, vì chúng sẽ bị loại bỏ cuối cùng.&lt;br /&gt;
&lt;br /&gt;
*'''Feature branches''': Nhánh sử dụng để phát triển tính năng mới cho bản triển khai sắp tới hoặc trong tương lai xa. Bản chất nhánh này tồn tại khi tính năng đang được phát triển, được merge vào nhánh develop nếu thành công và bị loại bỏ nếu thử nghiệm không thành công. Tên nhánh thường đặt theo tên feature để tiện theo dõi. &lt;br /&gt;
*'''Release branches''':&amp;amp;nbsp;Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''release-*''' &lt;br /&gt;
*'''Hotfix branches''': Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''hotfix-*''' &lt;br /&gt;
&lt;br /&gt;
Sau khi triển khai source code trên nhánh master thành công trên môi trường thật, thì thực hiện '''tag''' lại để lưu lại commit được sử dụng để triển khai.&lt;br /&gt;
&lt;br /&gt;
== '''Một số lệnh hay dùng trong GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q]&lt;br /&gt;
&lt;br /&gt;
=== '''Bảo vệ branch master''' ===&lt;br /&gt;
&lt;br /&gt;
Thông thường, nhánh master là nhánh quan trọng, chứa source code triển khai, vì vậy nhánh master này cần phải được bảo vệ để tránh các lệnh nguy hiểm.&amp;lt;br/&amp;gt; Để bảo vệ nhánh master này, bạn vào giao diện trên web, chọn '''Project '''=&amp;gt; Vào mục '''Setting '''của Project =&amp;gt;&amp;amp;nbsp;'''Repository''':&lt;br /&gt;
&lt;br /&gt;
[[File:Git protect branch.png|800px|Git protect branch.png]]&lt;br /&gt;
&lt;br /&gt;
Tại giao diện này, bạn có thể Protect/Unprotect một nhánh bất kỳ. Nhánh master luôn luôn phải được Protect để đảm bảo an toàn.&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo tag''' ===&lt;br /&gt;
&lt;br /&gt;
Sau khi source trên nhánh develop được triển khai, source trên nhánh develop sẽ được merge sang nhánh master. Chúng ta cần đánh dấu lại commit này trên master tương ứng với lần triển khai.&amp;lt;br/&amp;gt; Chúng ta tạo tag để làm việc này. Lệnh tạo tag như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git tag -a v5.0 -m &amp;quot;Create tag for release: Support new LTC coin&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; git push origin v5.0&amp;amp;nbsp;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Checkout tag bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git fetch --all --tags --prune&amp;lt;br/&amp;gt; git checkout tags/&amp;lt;tag_name&amp;gt; - b&amp;amp;nbsp;&amp;lt;branch_name&amp;gt;&amp;lt;br/&amp;gt; git checkout tags/v5.0 -b v5.0''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo branch mới''' ===&lt;br /&gt;
&lt;br /&gt;
Hiện tại bạn đang sửa code ở Local và muốn '''đẩy code ở Local&amp;amp;nbsp;lên Server''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn muốn '''clone source code từ master sang một branch mới''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa branch''' ===&lt;br /&gt;
&lt;br /&gt;
Trong thời gian phát triển sẽ có nhiều nhánh thừa, nhánh tạm và bạn sẽ có nhu cầu xóa bỏ chúng.&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa remote branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh '''xóa một remote branch''' (Branch trên server) như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout '''branch_name'''&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git push origin --delete '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa local branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh sau ép xóa một branch ở local, khi xóa phải đứng ở một branch khác:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git branch -D '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== '''Merge source code''' ===&lt;br /&gt;
&lt;br /&gt;
'''* C1: &amp;lt;u&amp;gt;Sử dụng giao diện Web&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Thông thương khi phát triển sẽ tạo nhiều branch khác nhau và sẽ có nhiều lúc bạn cần thực hiện lệnh merge source code giữa hai nhánh.&lt;br /&gt;
&lt;br /&gt;
Để '''an toàn''' bạn nên thực hiện lệnh merge trên website: Chọn '''Project''' =&amp;gt; '''Merge Requests''' =&amp;gt; Kích nút &amp;quot;'''New merge request'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 01.png|800px|Git merge branch 01.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 02.png|800px|Git merge branch 02.png]]&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Rebase&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Sử dụng rebase sẽ giữ lại được hết các commit nhưng bù lại thì nó phức tạp hơn và có nhiều rủi ro hơn.&amp;lt;br/&amp;gt; Lệnh sau để merge source code từ nhánh '''dev '''sang nhánh '''master''':&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout dev&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git rebase master&amp;lt;br/&amp;gt; git checkout master&amp;lt;br/&amp;gt; git merge --no-ff dev&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Merge&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Để đơn giản thì tốt nhất nên dùng '''GIT MERGE''' sẽ an toàn hơn nhưng sẽ có 1 số commit không được lưu lại.&amp;lt;br/&amp;gt; Ví dụ bạn muốn merge branch1 vào branch2 bạn thực hiện các lệnh sau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout branch1&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout branch2&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git merge branch1''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa commit trên remote''' ===&lt;br /&gt;
&lt;br /&gt;
Nếu bạn muốn lùi source code về commit trước đó bạn có thể thực hiện bằng 02 cách:&lt;br /&gt;
&lt;br /&gt;
*'''C1''': Tạo commit revert =&amp;gt; Cách này sẽ tạo thêm một commit khác và&amp;amp;nbsp;khi đó các branch khác có liên quan commit này phải rebase lại. &lt;br /&gt;
*'''C2''': Xóa trực tiếp commit này. &lt;br /&gt;
&lt;br /&gt;
Để xóa một commit, branch phải đang ở chế độ Unprotect (Trên Git Web, vào '''Setting '''=&amp;gt; '''Repository '''=&amp;gt; Thực hiện &amp;quot;'''Unprotect'''&amp;quot;).&amp;lt;br/&amp;gt; Lệnh sau sẽ thực hiện xóa 01 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git reset --hard HEAD~1&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau sẽ thực hiện xóa 02 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git reset --hard HEAD~2&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;'''Chú ý''':&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nếu xóa trên nhánh master, sau khi xóa xong cần phải Protect lại.&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;HEAD~ tương đương với HEAD~1&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nên sử dụng lệnh git log để kiểm tra lại commit&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Lưu password cho GIT HTTP''' ===&lt;br /&gt;
&lt;br /&gt;
Từ phiên bản '''1.7.9''' trở lên, GIT không tự động lưu password khi sử dụng HTTP/HTTPS vì vấn đề bảo mật.&amp;lt;br/&amp;gt; Bạn muốn bật chế độ này phải đánh lệnh sau:&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git config --global credential.helper store''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git reset''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://www.atlassian.com/git/tutorials/undoing-changes/git-reset https://www.atlassian.com/git/tutorials/undoing-changes/git-reset]&lt;br /&gt;
&lt;br /&gt;
Lệnh '''git reset''' là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính. Các hình thức này tương ứng với các đối số dòng lệnh '''--soft''', '''--mixed''', '''--hard'''. Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git:&amp;amp;nbsp;'''The Commit Tree (HEAD)''', '''The Staging Index''', và '''The Working Directory'''.&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git diff''' ===&lt;br /&gt;
&lt;br /&gt;
Lệnh sau hiển thị thay đổi ở tất cả các tệp:&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git diff&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Bạn muốn hiển thị các thay đổi của 1 file bạn đã sửa khi mà chưa thực hiện add hoặc commit:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 commit nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trong trường hợp đã commit nhưng chưa push, bạn có thể xem các thay đổi bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff --cached&amp;lt;br/&amp;gt; git diff --cached&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nếu bạn so sánh thay đổi của 1 tệp giữa hai commit bạn thực hiện lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 04c0252 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Lệnh git difftool'''&lt;br /&gt;
&lt;br /&gt;
Lệnh này tương tự lệnh git diff, nhưng sử dụng thêm công cụ thứ 3 để view.&amp;lt;br/&amp;gt; Lệnh sau sẽ cho chọn công cụ:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git&amp;amp;nbsp;difftool&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau xác định luôn sử dụng công cụ nào:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git difftool --tool=winmerge&amp;lt;br/&amp;gt; git difftool --tool=winmerge client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tương tự cho các dạng khác.&lt;br /&gt;
&lt;br /&gt;
== '''Kiến thức thêm về GIT''' ==&lt;br /&gt;
&lt;br /&gt;
=== '''So sánh giữa&amp;amp;nbsp;HEAD^ và&amp;amp;nbsp;HEAD~''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git]&lt;br /&gt;
&lt;br /&gt;
[[File:Git reset 01.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[Category:Build và quản lý source code]]&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=911</id>
		<title>Mô hình sử dụng GIT và một số lệnh hay dùng</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=911"/>
				<updated>2021-06-21T03:20:25Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== '''Mô hình sử dụng GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Việc quản lý branch trong GIT rất linh động, do đó thường mỗi công ty sẽ sử dụng mô hình riêng cho phù hợp với hiện trạng công ty.&amp;lt;br/&amp;gt; Thường khuyến khích mọi người sử dụng mô hình sau:&amp;amp;nbsp;'''[https://nvie.com/posts/a-successful-git-branching-model/ A successful Git branching model]'''&lt;br /&gt;
&lt;br /&gt;
[[File:Git-model-2x.png|600px|Git-model-2x.png]]&lt;br /&gt;
&lt;br /&gt;
Theo mô hình này sẽ có hai nhánh chính:&lt;br /&gt;
&lt;br /&gt;
*'''master''': Đây là nhánh chính thứ&amp;amp;nbsp;nhất, nơi chứa source code sẵn sàng để triển khai. &lt;br /&gt;
*'''develop''': Đây là nhánh chính thứ hai, chứa source code phát triển mới nhất cho lần triển khai sắp tới. Nhánh này là nhánh tích hợp, chứa các commit hàng ngày của các thành viên phát triển. Khi nào nhánh này đạt đến trạng thái &amp;quot;'''ổn định'''&amp;quot;, sẵn sàng cho việc triển khai thì sẽ được merge sang nhánh master. Việc merge từ develop vào master cần phải được kiểm soát chặt chẽ để đảm bảo an toàn. &lt;br /&gt;
&lt;br /&gt;
Bên cạnh hai nhánh chính ở trên, chúng ta còn sử dụng thêm các nhánh hỗ trợ khác để hỗ trợ phát triển song song giữa các Nhóm/Thành viên, theo dõi việc phát triển theo từng tính năng, chuẩn bị release sản phẩm hoặc khắc phục nhanh các lỗi trên môi trường thật.&amp;amp;nbsp;Không giống như các nhánh chính, các nhánh này luôn có thời gian sống hạn chế, vì chúng sẽ bị loại bỏ cuối cùng.&lt;br /&gt;
&lt;br /&gt;
*'''Feature branches''': Nhánh sử dụng để phát triển tính năng mới cho bản triển khai sắp tới hoặc trong tương lai xa. Bản chất nhánh này tồn tại khi tính năng đang được phát triển, được merge vào nhánh develop nếu thành công và bị loại bỏ nếu thử nghiệm không thành công. Tên nhánh thường đặt theo tên feature để tiện theo dõi. &lt;br /&gt;
*'''Release branches''':&amp;amp;nbsp;Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''release-*''' &lt;br /&gt;
*'''Hotfix branches''': Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''hotfix-*''' &lt;br /&gt;
&lt;br /&gt;
Sau khi triển khai source code trên nhánh master thành công trên môi trường thật, thì thực hiện '''tag''' lại để lưu lại commit được sử dụng để triển khai.&lt;br /&gt;
&lt;br /&gt;
== '''Một số lệnh hay dùng trong GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q]&lt;br /&gt;
&lt;br /&gt;
=== '''Bảo vệ branch master''' ===&lt;br /&gt;
&lt;br /&gt;
Thông thường, nhánh master là nhánh quan trọng, chứa source code triển khai, vì vậy nhánh master này cần phải được bảo vệ để tránh các lệnh nguy hiểm.&amp;lt;br/&amp;gt; Để bảo vệ nhánh master này, bạn vào giao diện trên web, chọn '''Project '''=&amp;gt; Vào mục '''Setting '''của Project =&amp;gt;&amp;amp;nbsp;'''Repository''':&lt;br /&gt;
&lt;br /&gt;
[[File:Git protect branch.png|800px|Git protect branch.png]]&lt;br /&gt;
&lt;br /&gt;
Tại giao diện này, bạn có thể Protect/Unprotect một nhánh bất kỳ. Nhánh master luôn luôn phải được Protect để đảm bảo an toàn.&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo tag''' ===&lt;br /&gt;
&lt;br /&gt;
Sau khi source trên nhánh develop được triển khai, source trên nhánh develop sẽ được merge sang nhánh master. Chúng ta cần đánh dấu lại commit này trên master tương ứng với lần triển khai.&amp;lt;br/&amp;gt; Chúng ta tạo tag để làm việc này. Lệnh tạo tag như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git tag -a v5.0 -m &amp;quot;Create tag for release: Support new LTC coin&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; git push origin v5.0&amp;amp;nbsp;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Checkout tag bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git fetch --all --tags --prune&amp;lt;br/&amp;gt; git checkout tags/version&amp;lt;br/&amp;gt; git checkout tags/v5.0''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo branch mới''' ===&lt;br /&gt;
&lt;br /&gt;
Hiện tại bạn đang sửa code ở Local và muốn '''đẩy code ở Local&amp;amp;nbsp;lên Server''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn muốn '''clone source code từ master sang một branch mới''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa branch''' ===&lt;br /&gt;
&lt;br /&gt;
Trong thời gian phát triển sẽ có nhiều nhánh thừa, nhánh tạm và bạn sẽ có nhu cầu xóa bỏ chúng.&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa remote branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh '''xóa một remote branch''' (Branch trên server) như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout '''branch_name'''&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git push origin --delete '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa local branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh sau ép xóa một branch ở local, khi xóa phải đứng ở một branch khác:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git branch -D '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== '''Merge source code''' ===&lt;br /&gt;
&lt;br /&gt;
'''* C1: &amp;lt;u&amp;gt;Sử dụng giao diện Web&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Thông thương khi phát triển sẽ tạo nhiều branch khác nhau và sẽ có nhiều lúc bạn cần thực hiện lệnh merge source code giữa hai nhánh.&lt;br /&gt;
&lt;br /&gt;
Để '''an toàn''' bạn nên thực hiện lệnh merge trên website: Chọn '''Project''' =&amp;gt; '''Merge Requests''' =&amp;gt; Kích nút &amp;quot;'''New merge request'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 01.png|800px|Git merge branch 01.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 02.png|800px|Git merge branch 02.png]]&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Rebase&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Sử dụng rebase sẽ giữ lại được hết các commit nhưng bù lại thì nó phức tạp hơn và có nhiều rủi ro hơn.&amp;lt;br/&amp;gt; Lệnh sau để merge source code từ nhánh '''dev '''sang nhánh '''master''':&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout dev&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git rebase master&amp;lt;br/&amp;gt; git checkout master&amp;lt;br/&amp;gt; git merge --no-ff dev&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Merge&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Để đơn giản thì tốt nhất nên dùng '''GIT MERGE''' sẽ an toàn hơn nhưng sẽ có 1 số commit không được lưu lại.&amp;lt;br/&amp;gt; Ví dụ bạn muốn merge branch1 vào branch2 bạn thực hiện các lệnh sau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout branch1&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout branch2&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git merge branch1''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa commit trên remote''' ===&lt;br /&gt;
&lt;br /&gt;
Nếu bạn muốn lùi source code về commit trước đó bạn có thể thực hiện bằng 02 cách:&lt;br /&gt;
&lt;br /&gt;
*'''C1''': Tạo commit revert =&amp;gt; Cách này sẽ tạo thêm một commit khác và&amp;amp;nbsp;khi đó các branch khác có liên quan commit này phải rebase lại. &lt;br /&gt;
*'''C2''': Xóa trực tiếp commit này. &lt;br /&gt;
&lt;br /&gt;
Để xóa một commit, branch phải đang ở chế độ Unprotect (Trên Git Web, vào '''Setting '''=&amp;gt; '''Repository '''=&amp;gt; Thực hiện &amp;quot;'''Unprotect'''&amp;quot;).&amp;lt;br/&amp;gt; Lệnh sau sẽ thực hiện xóa 01 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git reset --hard HEAD~1&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau sẽ thực hiện xóa 02 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git reset --hard HEAD~2&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;'''Chú ý''':&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nếu xóa trên nhánh master, sau khi xóa xong cần phải Protect lại.&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;HEAD~ tương đương với HEAD~1&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nên sử dụng lệnh git log để kiểm tra lại commit&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Lưu password cho GIT HTTP''' ===&lt;br /&gt;
&lt;br /&gt;
Từ phiên bản '''1.7.9''' trở lên, GIT không tự động lưu password khi sử dụng HTTP/HTTPS vì vấn đề bảo mật.&amp;lt;br/&amp;gt; Bạn muốn bật chế độ này phải đánh lệnh sau:&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git config --global credential.helper store''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git reset''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://www.atlassian.com/git/tutorials/undoing-changes/git-reset https://www.atlassian.com/git/tutorials/undoing-changes/git-reset]&lt;br /&gt;
&lt;br /&gt;
Lệnh '''git reset''' là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính. Các hình thức này tương ứng với các đối số dòng lệnh '''--soft''', '''--mixed''', '''--hard'''. Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git:&amp;amp;nbsp;'''The Commit Tree (HEAD)''', '''The Staging Index''', và '''The Working Directory'''.&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git diff''' ===&lt;br /&gt;
&lt;br /&gt;
Lệnh sau hiển thị thay đổi ở tất cả các tệp:&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git diff&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Bạn muốn hiển thị các thay đổi của 1 file bạn đã sửa khi mà chưa thực hiện add hoặc commit:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 commit nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trong trường hợp đã commit nhưng chưa push, bạn có thể xem các thay đổi bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff --cached&amp;lt;br/&amp;gt; git diff --cached&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nếu bạn so sánh thay đổi của 1 tệp giữa hai commit bạn thực hiện lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 04c0252 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Lệnh git difftool'''&lt;br /&gt;
&lt;br /&gt;
Lệnh này tương tự lệnh git diff, nhưng sử dụng thêm công cụ thứ 3 để view.&amp;lt;br/&amp;gt; Lệnh sau sẽ cho chọn công cụ:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git&amp;amp;nbsp;difftool&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau xác định luôn sử dụng công cụ nào:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git difftool --tool=winmerge&amp;lt;br/&amp;gt; git difftool --tool=winmerge client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tương tự cho các dạng khác.&lt;br /&gt;
&lt;br /&gt;
== '''Kiến thức thêm về GIT''' ==&lt;br /&gt;
&lt;br /&gt;
=== '''So sánh giữa&amp;amp;nbsp;HEAD^ và&amp;amp;nbsp;HEAD~''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git]&lt;br /&gt;
&lt;br /&gt;
[[File:Git reset 01.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[Category:Build và quản lý source code]]&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=910</id>
		<title>Mô hình sử dụng GIT và một số lệnh hay dùng</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=910"/>
				<updated>2021-06-21T03:18:14Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== '''Mô hình sử dụng GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Việc quản lý branch trong GIT rất linh động, do đó thường mỗi công ty sẽ sử dụng mô hình riêng cho phù hợp với hiện trạng công ty.&amp;lt;br/&amp;gt; Thường khuyến khích mọi người sử dụng mô hình sau:&amp;amp;nbsp;'''[https://nvie.com/posts/a-successful-git-branching-model/ A successful Git branching model]'''&lt;br /&gt;
&lt;br /&gt;
[[File:Git-model-2x.png|600px|Git-model-2x.png]]&lt;br /&gt;
&lt;br /&gt;
Theo mô hình này sẽ có hai nhánh chính:&lt;br /&gt;
&lt;br /&gt;
*'''master''': Đây là nhánh chính thứ&amp;amp;nbsp;nhất, nơi chứa source code sẵn sàng để triển khai. &lt;br /&gt;
*'''develop''': Đây là nhánh chính thứ hai, chứa source code phát triển mới nhất cho lần triển khai sắp tới. Nhánh này là nhánh tích hợp, chứa các commit hàng ngày của các thành viên phát triển. Khi nào nhánh này đạt đến trạng thái &amp;quot;'''ổn định'''&amp;quot;, sẵn sàng cho việc triển khai thì sẽ được merge sang nhánh master. Việc merge từ develop vào master cần phải được kiểm soát chặt chẽ để đảm bảo an toàn. &lt;br /&gt;
&lt;br /&gt;
Bên cạnh hai nhánh chính ở trên, chúng ta còn sử dụng thêm các nhánh hỗ trợ khác để hỗ trợ phát triển song song giữa các Nhóm/Thành viên, theo dõi việc phát triển theo từng tính năng, chuẩn bị release sản phẩm hoặc khắc phục nhanh các lỗi trên môi trường thật.&amp;amp;nbsp;Không giống như các nhánh chính, các nhánh này luôn có thời gian sống hạn chế, vì chúng sẽ bị loại bỏ cuối cùng.&lt;br /&gt;
&lt;br /&gt;
*'''Feature branches''': Nhánh sử dụng để phát triển tính năng mới cho bản triển khai sắp tới hoặc trong tương lai xa. Bản chất nhánh này tồn tại khi tính năng đang được phát triển, được merge vào nhánh develop nếu thành công và bị loại bỏ nếu thử nghiệm không thành công. Tên nhánh thường đặt theo tên feature để tiện theo dõi. &lt;br /&gt;
*'''Release branches''':&amp;amp;nbsp;Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''release-*''' &lt;br /&gt;
*'''Hotfix branches''': Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''hotfix-*''' &lt;br /&gt;
&lt;br /&gt;
Sau khi triển khai source code trên nhánh master thành công trên môi trường thật, thì thực hiện '''tag''' lại để lưu lại commit được sử dụng để triển khai.&lt;br /&gt;
&lt;br /&gt;
== '''Một số lệnh hay dùng trong GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q]&lt;br /&gt;
&lt;br /&gt;
=== '''Bảo vệ branch master''' ===&lt;br /&gt;
&lt;br /&gt;
Thông thường, nhánh master là nhánh quan trọng, chứa source code triển khai, vì vậy nhánh master này cần phải được bảo vệ để tránh các lệnh nguy hiểm.&amp;lt;br/&amp;gt; Để bảo vệ nhánh master này, bạn vào giao diện trên web, chọn '''Project '''=&amp;gt; Vào mục '''Setting '''của Project =&amp;gt;&amp;amp;nbsp;'''Repository''':&lt;br /&gt;
&lt;br /&gt;
[[File:Git protect branch.png|800px|Git protect branch.png]]&lt;br /&gt;
&lt;br /&gt;
Tại giao diện này, bạn có thể Protect/Unprotect một nhánh bất kỳ. Nhánh master luôn luôn phải được Protect để đảm bảo an toàn.&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo tag''' ===&lt;br /&gt;
&lt;br /&gt;
Sau khi source trên nhánh develop được triển khai, source trên nhánh develop sẽ được merge sang nhánh master. Chúng ta cần đánh dấu lại commit này trên master tương ứng với lần triển khai.&amp;lt;br/&amp;gt; Chúng ta tạo tag để làm việc này. Lệnh tạo tag như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git tag -a v5.0 -m &amp;quot;Create tag for release: Support new LTC coin&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; git push origin v5.0&amp;amp;nbsp;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Checkout tag bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout tags/version&amp;lt;br/&amp;gt; git checkout tags/v5.0''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo branch mới''' ===&lt;br /&gt;
&lt;br /&gt;
Hiện tại bạn đang sửa code ở Local và muốn '''đẩy code ở Local&amp;amp;nbsp;lên Server''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn muốn '''clone source code từ master sang một branch mới''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa branch''' ===&lt;br /&gt;
&lt;br /&gt;
Trong thời gian phát triển sẽ có nhiều nhánh thừa, nhánh tạm và bạn sẽ có nhu cầu xóa bỏ chúng.&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa remote branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh '''xóa một remote branch''' (Branch trên server) như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout '''branch_name'''&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git push origin --delete '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa local branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh sau ép xóa một branch ở local, khi xóa phải đứng ở một branch khác:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git branch -D '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== '''Merge source code''' ===&lt;br /&gt;
&lt;br /&gt;
'''* C1: &amp;lt;u&amp;gt;Sử dụng giao diện Web&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Thông thương khi phát triển sẽ tạo nhiều branch khác nhau và sẽ có nhiều lúc bạn cần thực hiện lệnh merge source code giữa hai nhánh.&lt;br /&gt;
&lt;br /&gt;
Để '''an toàn''' bạn nên thực hiện lệnh merge trên website: Chọn '''Project''' =&amp;gt; '''Merge Requests''' =&amp;gt; Kích nút &amp;quot;'''New merge request'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 01.png|800px|Git merge branch 01.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 02.png|800px|Git merge branch 02.png]]&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Rebase&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Sử dụng rebase sẽ giữ lại được hết các commit nhưng bù lại thì nó phức tạp hơn và có nhiều rủi ro hơn.&amp;lt;br/&amp;gt; Lệnh sau để merge source code từ nhánh '''dev '''sang nhánh '''master''':&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout dev&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git rebase master&amp;lt;br/&amp;gt; git checkout master&amp;lt;br/&amp;gt; git merge --no-ff dev&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Merge&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Để đơn giản thì tốt nhất nên dùng '''GIT MERGE''' sẽ an toàn hơn nhưng sẽ có 1 số commit không được lưu lại.&amp;lt;br/&amp;gt; Ví dụ bạn muốn merge branch1 vào branch2 bạn thực hiện các lệnh sau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout branch1&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout branch2&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git merge branch1''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa commit trên remote''' ===&lt;br /&gt;
&lt;br /&gt;
Nếu bạn muốn lùi source code về commit trước đó bạn có thể thực hiện bằng 02 cách:&lt;br /&gt;
&lt;br /&gt;
*'''C1''': Tạo commit revert =&amp;gt; Cách này sẽ tạo thêm một commit khác và&amp;amp;nbsp;khi đó các branch khác có liên quan commit này phải rebase lại. &lt;br /&gt;
*'''C2''': Xóa trực tiếp commit này. &lt;br /&gt;
&lt;br /&gt;
Để xóa một commit, branch phải đang ở chế độ Unprotect (Trên Git Web, vào '''Setting '''=&amp;gt; '''Repository '''=&amp;gt; Thực hiện &amp;quot;'''Unprotect'''&amp;quot;).&amp;lt;br/&amp;gt; Lệnh sau sẽ thực hiện xóa 01 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git reset --hard HEAD~1&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau sẽ thực hiện xóa 02 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git reset --hard HEAD~2&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;'''Chú ý''':&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nếu xóa trên nhánh master, sau khi xóa xong cần phải Protect lại.&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;HEAD~ tương đương với HEAD~1&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nên sử dụng lệnh git log để kiểm tra lại commit&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Lưu password cho GIT HTTP''' ===&lt;br /&gt;
&lt;br /&gt;
Từ phiên bản '''1.7.9''' trở lên, GIT không tự động lưu password khi sử dụng HTTP/HTTPS vì vấn đề bảo mật.&amp;lt;br/&amp;gt; Bạn muốn bật chế độ này phải đánh lệnh sau:&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git config --global credential.helper store''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git reset''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://www.atlassian.com/git/tutorials/undoing-changes/git-reset https://www.atlassian.com/git/tutorials/undoing-changes/git-reset]&lt;br /&gt;
&lt;br /&gt;
Lệnh '''git reset''' là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính. Các hình thức này tương ứng với các đối số dòng lệnh '''--soft''', '''--mixed''', '''--hard'''. Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git:&amp;amp;nbsp;'''The Commit Tree (HEAD)''', '''The Staging Index''', và '''The Working Directory'''.&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git diff''' ===&lt;br /&gt;
&lt;br /&gt;
Lệnh sau hiển thị thay đổi ở tất cả các tệp:&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git diff&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Bạn muốn hiển thị các thay đổi của 1 file bạn đã sửa khi mà chưa thực hiện add hoặc commit:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 commit nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trong trường hợp đã commit nhưng chưa push, bạn có thể xem các thay đổi bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff --cached&amp;lt;br/&amp;gt; git diff --cached&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nếu bạn so sánh thay đổi của 1 tệp giữa hai commit bạn thực hiện lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 04c0252 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Lệnh git difftool'''&lt;br /&gt;
&lt;br /&gt;
Lệnh này tương tự lệnh git diff, nhưng sử dụng thêm công cụ thứ 3 để view.&amp;lt;br/&amp;gt; Lệnh sau sẽ cho chọn công cụ:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git&amp;amp;nbsp;difftool&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau xác định luôn sử dụng công cụ nào:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git difftool --tool=winmerge&amp;lt;br/&amp;gt; git difftool --tool=winmerge client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tương tự cho các dạng khác.&lt;br /&gt;
&lt;br /&gt;
== '''Kiến thức thêm về GIT''' ==&lt;br /&gt;
&lt;br /&gt;
=== '''So sánh giữa&amp;amp;nbsp;HEAD^ và&amp;amp;nbsp;HEAD~''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git]&lt;br /&gt;
&lt;br /&gt;
[[File:Git reset 01.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[Category:Build và quản lý source code]]&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=908</id>
		<title>Mô hình sử dụng GIT và một số lệnh hay dùng</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=M%C3%B4_h%C3%ACnh_s%E1%BB%AD_d%E1%BB%A5ng_GIT_v%C3%A0_m%E1%BB%99t_s%E1%BB%91_l%E1%BB%87nh_hay_d%C3%B9ng&amp;diff=908"/>
				<updated>2021-01-23T15:57:27Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== '''Mô hình sử dụng GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Việc quản lý branch trong GIT rất linh động, do đó thường mỗi công ty sẽ sử dụng mô hình riêng cho phù hợp với hiện trạng công ty.&amp;lt;br/&amp;gt; Thường khuyến khích mọi người sử dụng mô hình sau:&amp;amp;nbsp;'''[https://nvie.com/posts/a-successful-git-branching-model/ A successful Git branching model]'''&lt;br /&gt;
&lt;br /&gt;
[[File:Git-model-2x.png|600px|Git-model-2x.png]]&lt;br /&gt;
&lt;br /&gt;
Theo mô hình này sẽ có hai nhánh chính:&lt;br /&gt;
&lt;br /&gt;
*'''master''': Đây là nhánh chính thứ&amp;amp;nbsp;nhất, nơi chứa source code sẵn sàng để triển khai. &lt;br /&gt;
*'''develop''': Đây là nhánh chính thứ hai, chứa source code phát triển mới nhất cho lần triển khai sắp tới. Nhánh này là nhánh tích hợp, chứa các commit hàng ngày của các thành viên phát triển. Khi nào nhánh này đạt đến trạng thái &amp;quot;'''ổn định'''&amp;quot;, sẵn sàng cho việc triển khai thì sẽ được merge sang nhánh master. Việc merge từ develop vào master cần phải được kiểm soát chặt chẽ để đảm bảo an toàn. &lt;br /&gt;
&lt;br /&gt;
Bên cạnh hai nhánh chính ở trên, chúng ta còn sử dụng thêm các nhánh hỗ trợ khác để hỗ trợ phát triển song song giữa các Nhóm/Thành viên, theo dõi việc phát triển theo từng tính năng, chuẩn bị release sản phẩm hoặc khắc phục nhanh các lỗi trên môi trường thật.&amp;amp;nbsp;Không giống như các nhánh chính, các nhánh này luôn có thời gian sống hạn chế, vì chúng sẽ bị loại bỏ cuối cùng.&lt;br /&gt;
&lt;br /&gt;
*'''Feature branches''': Nhánh sử dụng để phát triển tính năng mới cho bản triển khai sắp tới hoặc trong tương lai xa. Bản chất nhánh này tồn tại khi tính năng đang được phát triển, được merge vào nhánh develop nếu thành công và bị loại bỏ nếu thử nghiệm không thành công. Tên nhánh thường đặt theo tên feature để tiện theo dõi. &lt;br /&gt;
*'''Release branches''':&amp;amp;nbsp;Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''release-*''' &lt;br /&gt;
*'''Hotfix branches''': Tên nhánh này thường đặt theo cú pháp:&amp;amp;nbsp;'''hotfix-*''' &lt;br /&gt;
&lt;br /&gt;
Sau khi triển khai source code trên nhánh master thành công trên môi trường thật, thì thực hiện '''tag''' lại để lưu lại commit được sử dụng để triển khai.&lt;br /&gt;
&lt;br /&gt;
== '''Một số lệnh hay dùng trong GIT''' ==&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q https://hackmd.io/LyrNou22RXu5n9NAKMEn6Q]&lt;br /&gt;
&lt;br /&gt;
=== '''Bảo vệ branch master''' ===&lt;br /&gt;
&lt;br /&gt;
Thông thường, nhánh master là nhánh quan trọng, chứa source code triển khai, vì vậy nhánh master này cần phải được bảo vệ để tránh các lệnh nguy hiểm.&amp;lt;br/&amp;gt; Để bảo vệ nhánh master này, bạn vào giao diện trên web, chọn '''Project '''=&amp;gt; Vào mục '''Setting '''của Project =&amp;gt;&amp;amp;nbsp;'''Repository''':&lt;br /&gt;
&lt;br /&gt;
[[File:Git protect branch.png|800px|Git protect branch.png]]&lt;br /&gt;
&lt;br /&gt;
Tại giao diện này, bạn có thể Protect/Unprotect một nhánh bất kỳ. Nhánh master luôn luôn phải được Protect để đảm bảo an toàn.&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo tag''' ===&lt;br /&gt;
&lt;br /&gt;
Sau khi source trên nhánh develop được triển khai, source trên nhánh develop sẽ được merge sang nhánh master. Chúng ta cần đánh dấu lại commit này trên master tương ứng với lần triển khai.&amp;lt;br/&amp;gt; Chúng ta tạo tag để làm việc này. Lệnh tạo tag như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git tag -a v5.0 -m &amp;quot;Create tag for release: Support new LTC coin&amp;quot;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; git push origin v5.0&amp;amp;nbsp;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Tạo branch mới''' ===&lt;br /&gt;
&lt;br /&gt;
Hiện tại bạn đang sửa code ở Local và muốn '''đẩy code ở Local&amp;amp;nbsp;lên Server''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn muốn '''clone source code từ master sang một branch mới''', bạn sử dụng lệnh sau ('''branch_name''' là tên branch do bạn đặt):&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout -b '''branch_name'''&amp;lt;br/&amp;gt; git push origin '''branch_name'''&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa branch''' ===&lt;br /&gt;
&lt;br /&gt;
Trong thời gian phát triển sẽ có nhiều nhánh thừa, nhánh tạm và bạn sẽ có nhu cầu xóa bỏ chúng.&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa remote branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh '''xóa một remote branch''' (Branch trên server) như sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout '''branch_name'''&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git push origin --delete '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== '''Xóa local branch''' ====&lt;br /&gt;
&lt;br /&gt;
Lệnh sau ép xóa một branch ở local, khi xóa phải đứng ở một branch khác:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git branch -D '''branch_name'''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== '''Merge source code''' ===&lt;br /&gt;
&lt;br /&gt;
'''* C1: &amp;lt;u&amp;gt;Sử dụng giao diện Web&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Thông thương khi phát triển sẽ tạo nhiều branch khác nhau và sẽ có nhiều lúc bạn cần thực hiện lệnh merge source code giữa hai nhánh.&lt;br /&gt;
&lt;br /&gt;
Để '''an toàn''' bạn nên thực hiện lệnh merge trên website: Chọn '''Project''' =&amp;gt; '''Merge Requests''' =&amp;gt; Kích nút &amp;quot;'''New merge request'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 01.png|800px|Git merge branch 01.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Git merge branch 02.png|800px|Git merge branch 02.png]]&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Rebase&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Sử dụng rebase sẽ giữ lại được hết các commit nhưng bù lại thì nó phức tạp hơn và có nhiều rủi ro hơn.&amp;lt;br/&amp;gt; Lệnh sau để merge source code từ nhánh '''dev '''sang nhánh '''master''':&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout dev&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git rebase master&amp;lt;br/&amp;gt; git checkout master&amp;lt;br/&amp;gt; git merge --no-ff dev&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''* C2: &amp;lt;u&amp;gt;Sử dụng Merge&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Để đơn giản thì tốt nhất nên dùng '''GIT MERGE''' sẽ an toàn hơn nhưng sẽ có 1 số commit không được lưu lại.&amp;lt;br/&amp;gt; Ví dụ bạn muốn merge branch1 vào branch2 bạn thực hiện các lệnh sau:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout branch1&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git checkout branch2&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git merge branch1''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Xóa commit trên remote''' ===&lt;br /&gt;
&lt;br /&gt;
Nếu bạn muốn lùi source code về commit trước đó bạn có thể thực hiện bằng 02 cách:&lt;br /&gt;
&lt;br /&gt;
*'''C1''': Tạo commit revert =&amp;gt; Cách này sẽ tạo thêm một commit khác và&amp;amp;nbsp;khi đó các branch khác có liên quan commit này phải rebase lại. &lt;br /&gt;
*'''C2''': Xóa trực tiếp commit này. &lt;br /&gt;
&lt;br /&gt;
Để xóa một commit, branch phải đang ở chế độ Unprotect (Trên Git Web, vào '''Setting '''=&amp;gt; '''Repository '''=&amp;gt; Thực hiện &amp;quot;'''Unprotect'''&amp;quot;).&amp;lt;br/&amp;gt; Lệnh sau sẽ thực hiện xóa 01 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git reset --hard HEAD~1&amp;lt;br/&amp;gt; git log --oneline&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau sẽ thực hiện xóa 02 commit gần đây nhất trên nhánh master:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git checkout master&amp;lt;br/&amp;gt; git pull&amp;lt;br/&amp;gt; git reset --hard HEAD~2&amp;lt;br/&amp;gt; git push -f origin master''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;'''Chú ý''':&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nếu xóa trên nhánh master, sau khi xóa xong cần phải Protect lại.&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;HEAD~ tương đương với HEAD~1&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:#FF0000;&amp;quot;&amp;gt;Nên sử dụng lệnh git log để kiểm tra lại commit&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Lưu password cho GIT HTTP''' ===&lt;br /&gt;
&lt;br /&gt;
Từ phiên bản '''1.7.9''' trở lên, GIT không tự động lưu password khi sử dụng HTTP/HTTPS vì vấn đề bảo mật.&amp;lt;br/&amp;gt; Bạn muốn bật chế độ này phải đánh lệnh sau:&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git config --global credential.helper store''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git reset''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://www.atlassian.com/git/tutorials/undoing-changes/git-reset https://www.atlassian.com/git/tutorials/undoing-changes/git-reset]&lt;br /&gt;
&lt;br /&gt;
Lệnh '''git reset''' là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính. Các hình thức này tương ứng với các đối số dòng lệnh '''--soft''', '''--mixed''', '''--hard'''. Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git:&amp;amp;nbsp;'''The Commit Tree (HEAD)''', '''The Staging Index''', và '''The Working Directory'''.&lt;br /&gt;
&lt;br /&gt;
=== '''Lệnh git diff''' ===&lt;br /&gt;
&lt;br /&gt;
Lệnh sau hiển thị thay đổi ở tất cả các tệp:&amp;lt;br/&amp;gt; ''&amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;git diff&amp;lt;/span&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
Bạn muốn hiển thị các thay đổi của 1 file bạn đã sửa khi mà chưa thực hiện add hoặc commit:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bạn có thể xem thay đổi của local với 1 commit nào đó:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trong trường hợp đã commit nhưng chưa push, bạn có thể xem các thay đổi bằng lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff --cached&amp;lt;br/&amp;gt; git diff --cached&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nếu bạn so sánh thay đổi của 1 tệp giữa hai commit bạn thực hiện lệnh sau:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git diff &amp;lt;commit1&amp;gt; &amp;lt;commit2&amp;gt; &amp;lt;file_path&amp;gt;&amp;lt;br/&amp;gt; git diff 532f242 04c0252 auto-click.bat''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Lệnh git difftool'''&lt;br /&gt;
&lt;br /&gt;
Lệnh này tương tự lệnh git diff, nhưng sử dụng thêm công cụ thứ 3 để view.&amp;lt;br/&amp;gt; Lệnh sau sẽ cho chọn công cụ:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git&amp;amp;nbsp;difftool&amp;amp;nbsp;client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lệnh sau xác định luôn sử dụng công cụ nào:&amp;lt;br/&amp;gt; &amp;lt;span style=&amp;quot;color:#0000FF;&amp;quot;&amp;gt;''git difftool --tool=winmerge&amp;lt;br/&amp;gt; git difftool --tool=winmerge client/html/container.html''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tương tự cho các dạng khác.&lt;br /&gt;
&lt;br /&gt;
== '''Kiến thức thêm về GIT''' ==&lt;br /&gt;
&lt;br /&gt;
=== '''So sánh giữa&amp;amp;nbsp;HEAD^ và&amp;amp;nbsp;HEAD~''' ===&lt;br /&gt;
&lt;br /&gt;
Tham khảo:&amp;amp;nbsp;[https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git]&lt;br /&gt;
&lt;br /&gt;
[[File:Git reset 01.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[Category:Build và quản lý source code]]&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Mysql-log-tan-cong.png&amp;diff=906</id>
		<title>File:Mysql-log-tan-cong.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Mysql-log-tan-cong.png&amp;diff=906"/>
				<updated>2020-11-01T01:32:18Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:MySQL-bi-tan-cong.png&amp;diff=904</id>
		<title>File:MySQL-bi-tan-cong.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:MySQL-bi-tan-cong.png&amp;diff=904"/>
				<updated>2020-10-31T10:58:01Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-error-when-move-host.png&amp;diff=901</id>
		<title>File:Prestashop-error-when-move-host.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-error-when-move-host.png&amp;diff=901"/>
				<updated>2020-03-12T02:45:28Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-05.jpg&amp;diff=896</id>
		<title>File:Prestashop-many-fields-in-address-05.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-05.jpg&amp;diff=896"/>
				<updated>2020-02-29T10:11:36Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-04.jpg&amp;diff=895</id>
		<title>File:Prestashop-many-fields-in-address-04.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-04.jpg&amp;diff=895"/>
				<updated>2020-02-29T10:04:45Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-02.jpg&amp;diff=892</id>
		<title>File:Prestashop-many-fields-in-address-02.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-02.jpg&amp;diff=892"/>
				<updated>2020-02-29T09:54:54Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-invoice-address-change.png&amp;diff=891</id>
		<title>File:Prestashop-invoice-address-change.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-invoice-address-change.png&amp;diff=891"/>
				<updated>2020-02-29T09:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-invoice-status-change.png&amp;diff=885</id>
		<title>File:Prestashop-invoice-status-change.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-invoice-status-change.png&amp;diff=885"/>
				<updated>2020-02-29T04:00:20Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-01.jpg&amp;diff=882</id>
		<title>File:Prestashop-many-fields-in-address-01.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address-01.jpg&amp;diff=882"/>
				<updated>2020-02-28T17:15:01Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address.jpg&amp;diff=881</id>
		<title>File:Prestashop-many-fields-in-address.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-many-fields-in-address.jpg&amp;diff=881"/>
				<updated>2020-02-28T17:13:45Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-show-product-02.png&amp;diff=872</id>
		<title>File:Prestashop-show-product-02.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-show-product-02.png&amp;diff=872"/>
				<updated>2019-12-18T04:24:32Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-show-product-01.png&amp;diff=871</id>
		<title>File:Prestashop-show-product-01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-show-product-01.png&amp;diff=871"/>
				<updated>2019-12-18T04:24:09Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-contact-02.png&amp;diff=868</id>
		<title>File:Prestashop-contact-02.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-contact-02.png&amp;diff=868"/>
				<updated>2019-12-18T03:38:08Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	<entry>
		<id>https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-contact-01.png&amp;diff=867</id>
		<title>File:Prestashop-contact-01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.laptrinhblockchain.net//index.php?title=File:Prestashop-contact-01.png&amp;diff=867"/>
				<updated>2019-12-18T02:36:28Z</updated>
		
		<summary type="html">&lt;p&gt;Thangdb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Thangdb</name></author>	</entry>

	</feed>